Необъяснимое поведение VI. Event'ы и кнопки.
-
- beginner
- Сообщения: 17
- Зарегистрирован: 26 июн 2015, 13:10
- Версия LabVIEW: 14.0
Необъяснимое поведение VI. Event'ы и кнопки.
Добрый день.
Не могу понять, что я делаю не так и почему неправильно работает VI.
К сожалению, не могу прислать блок-схему - скорее всего коммерческая тайна.
Основа алгоритма - последовательность кадров.
В первом кадре в цикле while создан обработчик событий на кнопку выхода (Mouse Down?).
В третьем кадре в цикле while создан обработчик событий на ряд кнопок, в том числе и кнопку выхода.
Наблюдаются следующие странности: если ещё в первом кадре сначала кликнуть по любой кнопке кроме кнопки выхода (даже по тем, которые в этом кадре никак не упоминаются), VI перестанет реагировать на нажатия всех остальных кнопок. При этом выполнение продолжается, но нажатия на кнопки не приводят к выполнению кода события.
Далее, если в третьем кадре нажатие на кнопку выхода приводит к аналогичной ситуации: алгоритм выполняется, но обработчики событий ведут себя так, словно кликов по кнопке не совершается.
В приложении пример того, как обрабатывается событие нажатия в первом кадре. Понимаю, что картина очень неполная, но может быть есть идеи, из-за чего это может происходить и куда копать? Я раньше с таким не сталкивался и даже не знаю, с какой подступать стороны.
Не могу понять, что я делаю не так и почему неправильно работает VI.
К сожалению, не могу прислать блок-схему - скорее всего коммерческая тайна.
Основа алгоритма - последовательность кадров.
В первом кадре в цикле while создан обработчик событий на кнопку выхода (Mouse Down?).
В третьем кадре в цикле while создан обработчик событий на ряд кнопок, в том числе и кнопку выхода.
Наблюдаются следующие странности: если ещё в первом кадре сначала кликнуть по любой кнопке кроме кнопки выхода (даже по тем, которые в этом кадре никак не упоминаются), VI перестанет реагировать на нажатия всех остальных кнопок. При этом выполнение продолжается, но нажатия на кнопки не приводят к выполнению кода события.
Далее, если в третьем кадре нажатие на кнопку выхода приводит к аналогичной ситуации: алгоритм выполняется, но обработчики событий ведут себя так, словно кликов по кнопке не совершается.
В приложении пример того, как обрабатывается событие нажатия в первом кадре. Понимаю, что картина очень неполная, но может быть есть идеи, из-за чего это может происходить и куда копать? Я раньше с таким не сталкивался и даже не знаю, с какой подступать стороны.
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Необъяснимое поведение VI. Event'ы и кнопки.
Без полного кода проблематично будет выяснить, в чем причина, но вот несколько мыслей.
1. В коде используется одна или несколько Event Structure? Если несколько - это плохо, NI рекомендует в одной виайке использовать только одну евент структуру.
2. Странно, что кнопки обрабатываются по событию Mouse Down. Почему не Value Change?
3. На скрине есть подключенная константа к входу Таймаут. Какой там код выполняется? Если этот цикл находится в первом кадре, то выполнение может просто не переходит на второй кадр?
4. Останавливать цикл, изображенный на скрине, нужно не так. Необходимо событие на нажатие кнопки Proceed, иначе цикл не среагирует.
5. Посмотрите также в сторону механических свойств кнопок - иногда в этом заключается проблема, что по нажатию кнопка переходит в начальное состояние, и как бы ничего не работает...
Извините, если сумбурно, но, опять же, без кода тяжело сказать, что не так...
1. В коде используется одна или несколько Event Structure? Если несколько - это плохо, NI рекомендует в одной виайке использовать только одну евент структуру.
2. Странно, что кнопки обрабатываются по событию Mouse Down. Почему не Value Change?
3. На скрине есть подключенная константа к входу Таймаут. Какой там код выполняется? Если этот цикл находится в первом кадре, то выполнение может просто не переходит на второй кадр?
4. Останавливать цикл, изображенный на скрине, нужно не так. Необходимо событие на нажатие кнопки Proceed, иначе цикл не среагирует.
5. Посмотрите также в сторону механических свойств кнопок - иногда в этом заключается проблема, что по нажатию кнопка переходит в начальное состояние, и как бы ничего не работает...
Извините, если сумбурно, но, опять же, без кода тяжело сказать, что не так...
Мы делили апельсин - много наших полегло...
-
- beginner
- Сообщения: 17
- Зарегистрирован: 26 июн 2015, 13:10
- Версия LabVIEW: 14.0
Re: Необъяснимое поведение VI. Event'ы и кнопки.
Спасибо за ответ, но всё не туда, как мне кажется.
1. Разные обработчики (Event Structure) нужно использовать в разные моменты времени, поэтому они у меня в разных кадрах. Раньше я по неопытности создавал много обработчиков в одном месте, но всё работало.
2. Потому, что иногда нам всё-таки не нужно реагировать на нажатие кнопки. В этом случае мы выбираем "Mouse Down?" и к терминалу Disable подводим соответствующего буля. Но здесь дело вряд ли в этом, ибо с такими событиями я раньше работал и проблем не возникало. Впрочем, попробую завтра сократить использование "Mouse Down?".
3. Там ничего не выполняется.
4. Цикл реагирует на нажатие proceed. Кстати говоря, вот именно этот кадр, содержащий такой же цикл был у меня в предыдущей версии VI, где таких проблем не возникало.
5. Switch when pressed везде.
Ещё идей подкинете?
1. Разные обработчики (Event Structure) нужно использовать в разные моменты времени, поэтому они у меня в разных кадрах. Раньше я по неопытности создавал много обработчиков в одном месте, но всё работало.
2. Потому, что иногда нам всё-таки не нужно реагировать на нажатие кнопки. В этом случае мы выбираем "Mouse Down?" и к терминалу Disable подводим соответствующего буля. Но здесь дело вряд ли в этом, ибо с такими событиями я раньше работал и проблем не возникало. Впрочем, попробую завтра сократить использование "Mouse Down?".
3. Там ничего не выполняется.
4. Цикл реагирует на нажатие proceed. Кстати говоря, вот именно этот кадр, содержащий такой же цикл был у меня в предыдущей версии VI, где таких проблем не возникало.
5. Switch when pressed везде.
Ещё идей подкинете?
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Необъяснимое поведение VI. Event'ы и кнопки.
Не поленился, набросал похожий примерчик. Теперь все ясно
Нужно убирать с событий галочки "Lock Panel", тогда все будет работать (на скрине галочка активна, ее-то и нужно убрать). А так, мне кажется, Вы жмете на кнопку, для которой нет обработчика в первом фрейме, и Event Structure в замешательстве, и блокирует фронт-панель.
Объяснение так себе, но решение должно работать - надеюсь
Нужно убирать с событий галочки "Lock Panel", тогда все будет работать (на скрине галочка активна, ее-то и нужно убрать). А так, мне кажется, Вы жмете на кнопку, для которой нет обработчика в первом фрейме, и Event Structure в замешательстве, и блокирует фронт-панель.
Объяснение так себе, но решение должно работать - надеюсь
Мы делили апельсин - много наших полегло...
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Необъяснимое поведение VI. Event'ы и кнопки.
Если то, что я подглядел в предыдущем сообщении правда, можно смело претендовать на новый паттерн варинга)
- Вложения
-
- Stop VI or Hierarchy.vi
- (15.01 КБ) 186 скачиваний
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Необъяснимое поведение VI. Event'ы и кнопки.
Как уже верно сказано, проблема из-за блокировки FP обработчиком. И вряд ли в данном случае хорошим будет совет не блокировать FP. Программа, конечно, заработает, но память будет засоряться очередью событий. И, что ещё хуже, пока крутится первый кадр, а пользователь развлекается с кнопками, все его действия накапливаются в очереди, и когда программа дойдёт до последнего кадра, вся эта очередь дорвётся до процессорного времени и пользователь увидит очень странное поведение программы.
в данном случае ни на что не влияет, но зачем грузить процессор?
вариант первый (по-моему простой): использовать Event-Driven State Machine:
https://www.ieee.li/pdf/viewgraphs/labv ... plates.pdf
p34 и далее
вариант второй (для новичка вынос мозга):
использовать динамическую регистрацию событий (палитра Dialog&UI -> events).
Там как раз можно решить проблему и использования mouse down: когда событие не обрабатывается, снять регистрацию, и снова не надо городить кейсы.
Если хочется уйти в эту степь, не скромно порекомендую мой вебинар по event-ам, запись должна лежать на сайте NI в разделе событий.
по-моему, в "раньше" было больше опытности, это сейчас Вы по неопытности event-структуры разнесли и получили проблемы с поведением программы.dmitrii2209 писал(а):Спасибо за ответ, но всё не туда, как мне кажется.
1. Разные обработчики (Event Structure) нужно использовать в разные моменты времени, поэтому они у меня в разных кадрах. Раньше я по неопытности создавал много обработчиков в одном месте, но всё работало.
тут без разницы, но если там кнопки (а не другие контролы), то точно так же можно по кейсу выполнять или не выполнять действие.2. Потому, что иногда нам всё-таки не нужно реагировать на нажатие кнопки. В этом случае мы выбираем "Mouse Down?" и к терминалу Disable подводим соответствующего буля. Но здесь дело вряд ли в этом, ибо с такими событиями я раньше работал и проблем не возникало. Впрочем, попробую завтра сократить использование "Mouse Down?".
.3. Там ничего не выполняется
в данном случае ни на что не влияет, но зачем грузить процессор?
вариант первый (по-моему простой): использовать Event-Driven State Machine:
https://www.ieee.li/pdf/viewgraphs/labv ... plates.pdf
p34 и далее
вариант второй (для новичка вынос мозга):
использовать динамическую регистрацию событий (палитра Dialog&UI -> events).
Там как раз можно решить проблему и использования mouse down: когда событие не обрабатывается, снять регистрацию, и снова не надо городить кейсы.
Если хочется уйти в эту степь, не скромно порекомендую мой вебинар по event-ам, запись должна лежать на сайте NI в разделе событий.
-
- beginner
- Сообщения: 17
- Зарегистрирован: 26 июн 2015, 13:10
- Версия LabVIEW: 14.0
Re: Необъяснимое поведение VI. Event'ы и кнопки.
Правильно ли я понимаю, что если даже EventStructure расположена в кадре, который ещё не начал выполняться (либо уже выполнился в прошлом), она реагирует на Event'ы, описанные в ней так, как ей положено?
Да, кажется это так. Поработаю над перестройкой блок схемы. Мне кажется нелогичным, вообще говоря, учёт структуры, находящейся в неактивном блоке, но, видимо, в NI со мной по какой-то причине не согласны.
Отпишусь по результатам экспериментов с блок-схемой.
Да, кажется это так. Поработаю над перестройкой блок схемы. Мне кажется нелогичным, вообще говоря, учёт структуры, находящейся в неактивном блоке, но, видимо, в NI со мной по какой-то причине не согласны.
Отпишусь по результатам экспериментов с блок-схемой.
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Необъяснимое поведение VI. Event'ы и кнопки.
что тут нелогичного?dmitrii2209 писал(а):. Мне кажется нелогичным, вообще говоря, учёт структуры, находящейся в неактивном блоке, но, видимо, в NI со мной по какой-то причине не согласны..
каким мистическим образом event структура должна догадаться, что она уже или ещё не активна?
она есть, события зарегистрированы в системе, значит они накапливаются.
-
- beginner
- Сообщения: 17
- Зарегистрирован: 26 июн 2015, 13:10
- Версия LabVIEW: 14.0
Re: Необъяснимое поведение VI. Event'ы и кнопки.
То, что выполняется код из блока, до которого мы ещё не дошли.Artem.spb писал(а):что тут нелогичного?
Никакой мистики. Если мы в том же кадре переменной, имевшей значение "10" назначим инкрементирование значения, она примет значение "11" не раньше и не позже, а именно в этом кадре. Процедура инкремента каким-то образом ведь догадывается, что настало её время. Чем обработчик событий хуже?Artem.spb писал(а):каким мистическим образом event структура должна догадаться, что она уже или ещё не активна?
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Необъяснимое поведение VI. Event'ы и кнопки.
Но события не выполняются, они находятся в очереди. Когда выполнение дойдет до нужного кадра, тогда событие будет выполнено.dmitrii2209 писал(а): То, что выполняется код из блока, до которого мы ещё не дошли.
Мы делили апельсин - много наших полегло...
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Необъяснимое поведение VI. Event'ы и кнопки.
В Вашем случае регистрируются события GUI и пользователю все равно, чем в данный момент занимается программа (выполняет расчеты или ждет нажатия кнопки). Пользователь просто берет и нажимает, а программа, когда появится возможность, обрабатывает событие.dmitrii2209 писал(а):Никакой мистики. Если мы в том же кадре переменной, имевшей значение "10" назначим инкрементирование значения, она примет значение "11" не раньше и не позже, а именно в этом кадре. Процедура инкремента каким-то образом ведь догадывается, что настало её время. Чем обработчик событий хуже?
По этому, как правило, обработку событий GUI и вычислительную части, разносят в разные циклы.
Полистайте книгу "LabVIEW. Стиль программирования" Питер Блюм . Многое станет понятнее.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- beginner
- Сообщения: 17
- Зарегистрирован: 26 июн 2015, 13:10
- Версия LabVIEW: 14.0
Re: Необъяснимое поведение VI. Event'ы и кнопки.
Правильно, события не выполняются, события регистрируется. Выполняется код, соответствующий событию.Kosist писал(а):Но события не выполняются, они находятся в очереди. Когда выполнение дойдет до нужного кадра, тогда событие будет выполнено.
Ведь если бы в третьем кадре не было вообще Event Structure, клики по соответствующим кнопкам игнорировались бы и FP не блокировался бы. Почему же не игнорируются события, обозначенные в неактуальном Event Structure? Я, конечно, понимаю, что наши представления о логичности могут различаться. И вот мне это кажется нелогичным.
Но что делать, если в зависимости от обстоятельств нам надо выполнять разный алгоритм для одного и того же действия пользователя? В моём случае данные, необходимые для выполнения некоторых Event Case'ов создаются только во втором кадре, откуда передаются на Event Structure. Из-за этого Event Structure всё равно не будет активным ранее выполнения второго кадра (не, можно, конечно, нагородить что-нибудь с использованием очередей или ещё каких-нибудь конструкций и флагов, Case Structure внутри каждого Event Case, но, может быть, можно обойтись меньшим количеством сущностей?). Как сделать так, чтоб клики по кнопкам хотя бы тупо игнорировались до третьего кадра?IvanLis писал(а):В Вашем случае регистрируются события GUI и пользователю все равно, в чем в данный момент занимается программа (выполняет расчеты или ждет нажатия кнопки). Пользователь просто берет и нажимает, а программа, когда появится возможность, обрабатывает событие.
По этому, как правило обработку событий GUI и вычислительную части, разносят в разные циклы.
А вот за книгу спасибо. Давно стоило почитать что-нибудь в этом духе.IvanLis писал(а):Полистайте книгу "LabVIEW. Стиль программирования" Питер Блюм . Многое станет понятнее.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Необъяснимое поведение VI. Event'ы и кнопки.
Обычно, для того, что бы предугадать неправильные действия пользователя, кнопки, которые он в данный момент не должен нажимать блокируются или скрываются. Для этого используются свойства disable и visible.dmitrii2209 писал(а):Но что делать, если в зависимости от обстоятельств нам надо выполнять разный алгоритм для одного и того же действия пользователя? В моём случае данные, необходимые для выполнения некоторых Event Case'ов создаются только во втором кадре, откуда передаются на Event Structure. Из-за этого Event Structure всё равно не будет активным ранее выполнения второго кадра (не, можно, конечно, нагородить что-нибудь с использованием очередей или ещё каких-нибудь конструкций и флагов, Case Structure внутри каждого Event Case, но, может быть, можно обойтись меньшим количеством сущностей?). Как сделать так, чтоб клики по кнопкам хотя бы тупо игнорировались до третьего кадра?
И так поступают во всех языках программирования, в том числе и текстовых. Например в Delphi событие button.click обработается независимо от этапа работы алгоритма программы.
Думаю я ответил на Ваш вопрос. Ведь логика работы программы и ее реализация лежит полностью на совести программиста, а как он ее будет реализовывать, это пользователя не интересует.dmitrii2209 писал(а):Почему же не игнорируются события, обозначенные в неактуальном Event Structure? Я, конечно, понимаю, что наши представления о логичности могут различаться. И вот мне это кажется нелогичным.
Так что можете поразвлечься. Сделать так что бы в начальный момент были доступны только элементы обрабатываемые первой Event Structure. После того как пользователь выполнил необходимые действия и выполнил переход ко второй Event Structure, первая группа кнопок "закрывается", вторая "открывается" .... и т.д. и т.п.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- beginner
- Сообщения: 17
- Зарегистрирован: 26 июн 2015, 13:10
- Версия LabVIEW: 14.0
Re: Необъяснимое поведение VI. Event'ы и кнопки.
Хорошо, если кнопки не нужны, их можно деактивировать. Но если одна кнопка должна по разному работать в разных случаях? Например, на этапе первого кадра нажатие кнопки Stop должно просто останавливать VI, а вот на этапе третьего кадра уже выполнять некоторые действия перед закрытием, как закрытие разных каналов, деактивировании контроллеров и прочее.IvanLis писал(а):Обычно, для того, что бы предугадать неправильные действия пользователя, кнопки, которые он в данный момент не должен нажимать блокируются или скрываются. Для этого используются свойства disable и visible.
Не, я уже придумал как это можно реализовать, но мои идеи больше похожи на изобретения велосипедов. Возможно уже до меня кто-нибудь придумал что-нибудь красивое и лаконичное.
В данном случае речь шла о логике языка, а не о логике программы.IvanLis писал(а):Ведь логика работы программы и ее реализация лежит полностью на совести программиста, а как он ее будет реализовывать, это пользователя не интересует.
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Необъяснимое поведение VI. Event'ы и кнопки.
Архитектура - наше все...dmitrii2209 писал(а):Но если одна кнопка должна по разному работать в разных случаях? Например, на этапе первого кадра нажатие кнопки Stop должно просто останавливать VI, а вот на этапе третьего кадра уже выполнять некоторые действия перед закрытием, как закрытие разных каналов, деактивировании контроллеров и прочее.
Ваши фреймы - это состояния системы. При чем, с точными условиями перехода из состояния в состояние. Почему нельзя использовать Producer-Consumer Queued State Machine паттерн? Верхний цикл - обрабатывает нажатия кнопок, и посылает их во второй цикл. А во втором цикле определяете, что нужно делать - создайте енум с названиями состояния системы, и в стейте на обработку нажатия той или иной кнопки, при помощи енума и кейс-структуры определяйте, какое действие нужно делать. И тогда на кнопку можно вешать сколько угодно различных сценариев; главное - правильно определять, в каком состоянии находится Ваша система...
Ведь тут все просто - либо "простота" кода, но никакой его "расширяемости", либо чуточку побольше кода, но намного больше пространства для добавления/изменения/обновления функционала; как мне кажется...
Мы делили апельсин - много наших полегло...
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение