2016-08-10 6 views
2

Я пытаюсь создать экран входа. Он принимает имя пользователя и пароль. Кроме того, я создаю текстовый файл, я ввожу правильные имена пользователей и пароли в текстовый файл.Создание экрана входа в labview

Когда я нажимаю confirm button (после ввода имени пользователя и пароля на экран входа в систему), программа соответствует имени пользователя и паролю, если они действительны, а затем свет открыт.

Это работает, но когда я пытаюсь нажать confirm button более 2 раз, он терпит неудачу. На самом деле не дать ошибку, но подтвердить кнопку заблокирована так, я не могу сделать пробную версию более 2. Каковы возможные причины для этого?

Вот мой VI: here is the my vi

+1

Даже для программ, которые не очень важны, вы не должны хранить учетные данные как обычный текст в файле с именем'login.txt '. Это делает процесс входа в систему устаревшим ... –

+0

Если кнопка OK перестает реагировать, это звучит так, как будто внутренний цикл While не выходит. Испытали ли вы, что происходит с помощью зондов и/или подсветки выполнения? Это непонятно из вашего изображения, но похоже, что стоп-терминал этого цикла получит только истинное значение, если имя пользователя и пароль совпадают с значениями в файле, иначе он будет работать бесконечно. Если вы можете опубликовать фрагмент VI вместо простого изображения, мы можем проверить это для вас. – nekomatic

+1

Как упоминалось некоматично, внутренний цикл while не выходит. Это происходит потому, что ваш цикл while только закрывается, когда он находит совпадающее имя пользователя и пароль. Вам нужна дополнительная логика в регулярном выражении, так что если вы прочитаете файл и не нашли его, цикл завершится. Есть много способов сделать это, мой предпочтительный - сменный регистр. Как сказал Каспар, вам нужно хэшировать пароль с чем-то вроде SHA2 или AES, оба из которых имеют библиотеки LV. Убедитесь, что ваш пароль отображается как таковой, щелкнув его правой кнопкой мыши и выбрав режим отображения «Пароль». Также закройте файл. – ijustlovemath

ответ

1

Переместить весь код в случае структуры внутри корпуса событий. Всякий раз, когда есть событие click, код внутри структуры case будет выполнен. Следовательно, нет необходимости подключать логическое значение из кнопки OK к внешнему событию.

OK событие: "OK event"

Кроме того, я бы остановить дело с кнопкой остановки для завершения цикла.

Остановить событие: "Stop event"

+0

Этот ответ не объясняет проблему, описанную в вопросе, и если мое предположение о том, что вызывает проблему, является правильным (т. Е. Внутренний цикл while не выходит), то это не решит проблему. – nekomatic

1

В вашем примере код выглядит как в первый раз на кнопку подтверждения нажимается случае структура будет работать. В цикле While имя пользователя и пароль проверяются на текстовый файл, и если оба соответствуют светодиодному индикатору, оно соответствует истинному, а цикл while остановлен. Если ни имя пользователя, ни пароль не соответствуют данным текстового файла, тогда светодиод будет оставаться выключенным, и цикл будет продолжаться, снова заблокировав кнопку подтверждения.

Если вы посмотрите на функцию вашего кода, узел обратной связи сохранит предыдущее значение, поэтому во второй раз, когда нажата кнопка подтверждения, имя пользователя и пароли проверяются из записи, следующей за последней найденной записью. Если новое имя пользователя предшествует или то же самое, то оно не будет найдено, поэтому он войдет в бесконечный цикл, как в предыдущем случае.

Чтобы решить эту проблему, вы должны смотреть на:

  1. инициализатор терминал для узла обратной связи используется только для впервые VI выполняется, если он находится внутри цикла, то он не будет иметь никакого эффекта при последующем исполнении. Вы должны удалить его и изменить свой код, чтобы гарантировать, что полный файл проверяется каждый раз. Возможно, попробуйте использовать терминал сдвигового регистра на краю цикла while и проехать к дальней стороне цикла.
  2. Посмотрите на случай, когда имя пользователя и пароли не совпадают, чтобы предотвратить бесконечный цикл.
0

Существует некоторая логическая проблема с кодом, который еще никто не обратился, что приводит к сбою.

Как многие другие указали, ваш внутренний цикл while не выходит. Похоже, что оператор case во внутреннем цикле while всегда прав, поскольку вы привязывали его к булевой константе TRUE. Ваш код войдет в этот регистр, и если ваше имя пользователя или пароль неверны, ваш AND приведет к ложному.Индикатор не изменится, но вы также не остановите цикл. Чтобы читать новые значения, вы должны остановить внутренний цикл while.

-1

На вопрос, кажется, были ответы другие пользователи, поэтому я просто хотел добавить свои два цента от того, что я только что реализовал что-то очень похожее. Нам нужно было защитить информацию в файле имени пользователя и пароля, чтобы предотвратить/обнаружить фальсификацию. С этой целью мы использовали встроенную функцию MD5 в labivew для создания хэша пароля, а затем вычислили хэш ввода пользователя с хешем, хранящимся в файле.

Кроме того, чтобы люди не перекомпилировали хэш и не вставили его в файл, мы взяли строку данных и вычислили хэш элементов строки и поместили их в файл, чтобы система могла определить, имеет ли хеш строки сопоставляются и идентифицируют любые подделки.

Кроме того, мы соленый хэш со строкой, чтобы даже если пользователь знал, какая информация была использована для вычисления хеша, они все равно должны были бы знать, как эта строка была солена, чтобы иметь возможность создавать правильные контрольные суммы. Возможно, это слишком много для ваших целей, но, поскольку на вопрос, похоже, был дан ответ, я подумал, что брошу это для вас.

Смежные вопросы