Необъяснимое поведение VI. Event'ы и кнопки.

Обсуждение, связанное с разработкой ПО верхнего уровня
dmitrii2209
beginner
beginner
Сообщения: 17
Зарегистрирован: 26 июн 2015, 13:10
Версия LabVIEW: 14.0

Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение dmitrii2209 »

Добрый день.
Не могу понять, что я делаю не так и почему неправильно работает VI.
К сожалению, не могу прислать блок-схему - скорее всего коммерческая тайна.
Основа алгоритма - последовательность кадров.
В первом кадре в цикле while создан обработчик событий на кнопку выхода (Mouse Down?).
В третьем кадре в цикле while создан обработчик событий на ряд кнопок, в том числе и кнопку выхода.
Наблюдаются следующие странности: если ещё в первом кадре сначала кликнуть по любой кнопке кроме кнопки выхода (даже по тем, которые в этом кадре никак не упоминаются), VI перестанет реагировать на нажатия всех остальных кнопок. При этом выполнение продолжается, но нажатия на кнопки не приводят к выполнению кода события.
Далее, если в третьем кадре нажатие на кнопку выхода приводит к аналогичной ситуации: алгоритм выполняется, но обработчики событий ведут себя так, словно кликов по кнопке не совершается.
В приложении пример того, как обрабатывается событие нажатия в первом кадре.
Снимок.PNG
Понимаю, что картина очень неполная, но может быть есть идеи, из-за чего это может происходить и куда копать? Я раньше с таким не сталкивался и даже не знаю, с какой подступать стороны.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение Kosist »

Без полного кода проблематично будет выяснить, в чем причина, но вот несколько мыслей.
1. В коде используется одна или несколько Event Structure? Если несколько - это плохо, NI рекомендует в одной виайке использовать только одну евент структуру.
2. Странно, что кнопки обрабатываются по событию Mouse Down. Почему не Value Change?
3. На скрине есть подключенная константа к входу Таймаут. Какой там код выполняется? Если этот цикл находится в первом кадре, то выполнение может просто не переходит на второй кадр?
4. Останавливать цикл, изображенный на скрине, нужно не так. Необходимо событие на нажатие кнопки Proceed, иначе цикл не среагирует.
5. Посмотрите также в сторону механических свойств кнопок - иногда в этом заключается проблема, что по нажатию кнопка переходит в начальное состояние, и как бы ничего не работает...

Извините, если сумбурно, но, опять же, без кода тяжело сказать, что не так...
Мы делили апельсин - много наших полегло...
dmitrii2209
beginner
beginner
Сообщения: 17
Зарегистрирован: 26 июн 2015, 13:10
Версия LabVIEW: 14.0

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение dmitrii2209 »

Спасибо за ответ, но всё не туда, как мне кажется.
1. Разные обработчики (Event Structure) нужно использовать в разные моменты времени, поэтому они у меня в разных кадрах. Раньше я по неопытности создавал много обработчиков в одном месте, но всё работало.
2. Потому, что иногда нам всё-таки не нужно реагировать на нажатие кнопки. В этом случае мы выбираем "Mouse Down?" и к терминалу Disable подводим соответствующего буля. Но здесь дело вряд ли в этом, ибо с такими событиями я раньше работал и проблем не возникало. Впрочем, попробую завтра сократить использование "Mouse Down?".
3. Там ничего не выполняется.
4. Цикл реагирует на нажатие proceed. Кстати говоря, вот именно этот кадр, содержащий такой же цикл был у меня в предыдущей версии VI, где таких проблем не возникало.
5. Switch when pressed везде.
Ещё идей подкинете?
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение Kosist »

Не поленился, набросал похожий примерчик. Теперь все ясно :crazy:
Нужно убирать с событий галочки "Lock Panel", тогда все будет работать (на скрине галочка активна, ее-то и нужно убрать). А так, мне кажется, Вы жмете на кнопку, для которой нет обработчика в первом фрейме, и Event Structure в замешательстве, и блокирует фронт-панель.
Объяснение так себе, но решение должно работать - надеюсь :wink:
Вложения
Event Structure.png
Events.png
Мы делили апельсин - много наших полегло...
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение Blackman »

Если то, что я подглядел в предыдущем сообщении правда, можно смело претендовать на новый паттерн варинга)
Вложения
Stop VI or Hierarchy.PNG
Stop VI or Hierarchy.vi
(15.01 КБ) 185 скачиваний
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение Artem.spb »

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

dmitrii2209 писал(а):Спасибо за ответ, но всё не туда, как мне кажется.
1. Разные обработчики (Event Structure) нужно использовать в разные моменты времени, поэтому они у меня в разных кадрах. Раньше я по неопытности создавал много обработчиков в одном месте, но всё работало.
по-моему, в "раньше" было больше опытности, это сейчас Вы по неопытности event-структуры разнесли и получили проблемы с поведением программы.
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 в разделе событий.
dmitrii2209
beginner
beginner
Сообщения: 17
Зарегистрирован: 26 июн 2015, 13:10
Версия LabVIEW: 14.0

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение dmitrii2209 »

Правильно ли я понимаю, что если даже EventStructure расположена в кадре, который ещё не начал выполняться (либо уже выполнился в прошлом), она реагирует на Event'ы, описанные в ней так, как ей положено?
Да, кажется это так. Поработаю над перестройкой блок схемы. Мне кажется нелогичным, вообще говоря, учёт структуры, находящейся в неактивном блоке, но, видимо, в NI со мной по какой-то причине не согласны.
Отпишусь по результатам экспериментов с блок-схемой.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение Artem.spb »

dmitrii2209 писал(а):. Мне кажется нелогичным, вообще говоря, учёт структуры, находящейся в неактивном блоке, но, видимо, в NI со мной по какой-то причине не согласны..
что тут нелогичного?
каким мистическим образом event структура должна догадаться, что она уже или ещё не активна?
она есть, события зарегистрированы в системе, значит они накапливаются.
dmitrii2209
beginner
beginner
Сообщения: 17
Зарегистрирован: 26 июн 2015, 13:10
Версия LabVIEW: 14.0

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение dmitrii2209 »

Artem.spb писал(а):что тут нелогичного?
То, что выполняется код из блока, до которого мы ещё не дошли.
Artem.spb писал(а):каким мистическим образом event структура должна догадаться, что она уже или ещё не активна?
Никакой мистики. Если мы в том же кадре переменной, имевшей значение "10" назначим инкрементирование значения, она примет значение "11" не раньше и не позже, а именно в этом кадре. Процедура инкремента каким-то образом ведь догадывается, что настало её время. Чем обработчик событий хуже?
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение Kosist »

dmitrii2209 писал(а): То, что выполняется код из блока, до которого мы ещё не дошли.
Но события не выполняются, они находятся в очереди. Когда выполнение дойдет до нужного кадра, тогда событие будет выполнено.
Мы делили апельсин - много наших полегло...
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение IvanLis »

dmitrii2209 писал(а):Никакой мистики. Если мы в том же кадре переменной, имевшей значение "10" назначим инкрементирование значения, она примет значение "11" не раньше и не позже, а именно в этом кадре. Процедура инкремента каким-то образом ведь догадывается, что настало её время. Чем обработчик событий хуже?
В Вашем случае регистрируются события GUI и пользователю все равно, чем в данный момент занимается программа (выполняет расчеты или ждет нажатия кнопки). Пользователь просто берет и нажимает, а программа, когда появится возможность, обрабатывает событие.
По этому, как правило, обработку событий GUI и вычислительную части, разносят в разные циклы.

Полистайте книгу "LabVIEW. Стиль программирования" Питер Блюм . Многое станет понятнее.
dmitrii2209
beginner
beginner
Сообщения: 17
Зарегистрирован: 26 июн 2015, 13:10
Версия LabVIEW: 14.0

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение dmitrii2209 »

Kosist писал(а):Но события не выполняются, они находятся в очереди. Когда выполнение дойдет до нужного кадра, тогда событие будет выполнено.
Правильно, события не выполняются, события регистрируется. Выполняется код, соответствующий событию.
Ведь если бы в третьем кадре не было вообще Event Structure, клики по соответствующим кнопкам игнорировались бы и FP не блокировался бы. Почему же не игнорируются события, обозначенные в неактуальном Event Structure? Я, конечно, понимаю, что наши представления о логичности могут различаться. И вот мне это кажется нелогичным.
IvanLis писал(а):В Вашем случае регистрируются события GUI и пользователю все равно, в чем в данный момент занимается программа (выполняет расчеты или ждет нажатия кнопки). Пользователь просто берет и нажимает, а программа, когда появится возможность, обрабатывает событие.
По этому, как правило обработку событий GUI и вычислительную части, разносят в разные циклы.
Но что делать, если в зависимости от обстоятельств нам надо выполнять разный алгоритм для одного и того же действия пользователя? В моём случае данные, необходимые для выполнения некоторых Event Case'ов создаются только во втором кадре, откуда передаются на Event Structure. Из-за этого Event Structure всё равно не будет активным ранее выполнения второго кадра (не, можно, конечно, нагородить что-нибудь с использованием очередей или ещё каких-нибудь конструкций и флагов, Case Structure внутри каждого Event Case, но, может быть, можно обойтись меньшим количеством сущностей?). Как сделать так, чтоб клики по кнопкам хотя бы тупо игнорировались до третьего кадра?
IvanLis писал(а):Полистайте книгу "LabVIEW. Стиль программирования" Питер Блюм . Многое станет понятнее.
А вот за книгу спасибо. Давно стоило почитать что-нибудь в этом духе.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение IvanLis »

dmitrii2209 писал(а):Но что делать, если в зависимости от обстоятельств нам надо выполнять разный алгоритм для одного и того же действия пользователя? В моём случае данные, необходимые для выполнения некоторых Event Case'ов создаются только во втором кадре, откуда передаются на Event Structure. Из-за этого Event Structure всё равно не будет активным ранее выполнения второго кадра (не, можно, конечно, нагородить что-нибудь с использованием очередей или ещё каких-нибудь конструкций и флагов, Case Structure внутри каждого Event Case, но, может быть, можно обойтись меньшим количеством сущностей?). Как сделать так, чтоб клики по кнопкам хотя бы тупо игнорировались до третьего кадра?
Обычно, для того, что бы предугадать неправильные действия пользователя, кнопки, которые он в данный момент не должен нажимать блокируются или скрываются. Для этого используются свойства disable и visible.
И так поступают во всех языках программирования, в том числе и текстовых. Например в Delphi событие button.click обработается независимо от этапа работы алгоритма программы.
dmitrii2209 писал(а):Почему же не игнорируются события, обозначенные в неактуальном Event Structure? Я, конечно, понимаю, что наши представления о логичности могут различаться. И вот мне это кажется нелогичным.
Думаю я ответил на Ваш вопрос. Ведь логика работы программы и ее реализация лежит полностью на совести программиста, а как он ее будет реализовывать, это пользователя не интересует.

Так что можете поразвлечься. Сделать так что бы в начальный момент были доступны только элементы обрабатываемые первой Event Structure. После того как пользователь выполнил необходимые действия и выполнил переход ко второй Event Structure, первая группа кнопок "закрывается", вторая "открывается" .... и т.д. и т.п.
dmitrii2209
beginner
beginner
Сообщения: 17
Зарегистрирован: 26 июн 2015, 13:10
Версия LabVIEW: 14.0

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение dmitrii2209 »

IvanLis писал(а):Обычно, для того, что бы предугадать неправильные действия пользователя, кнопки, которые он в данный момент не должен нажимать блокируются или скрываются. Для этого используются свойства disable и visible.
Хорошо, если кнопки не нужны, их можно деактивировать. Но если одна кнопка должна по разному работать в разных случаях? Например, на этапе первого кадра нажатие кнопки Stop должно просто останавливать VI, а вот на этапе третьего кадра уже выполнять некоторые действия перед закрытием, как закрытие разных каналов, деактивировании контроллеров и прочее.
Не, я уже придумал как это можно реализовать, но мои идеи больше похожи на изобретения велосипедов. Возможно уже до меня кто-нибудь придумал что-нибудь красивое и лаконичное.
IvanLis писал(а):Ведь логика работы программы и ее реализация лежит полностью на совести программиста, а как он ее будет реализовывать, это пользователя не интересует.
В данном случае речь шла о логике языка, а не о логике программы.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Необъяснимое поведение VI. Event'ы и кнопки.

Сообщение Kosist »

dmitrii2209 писал(а):Но если одна кнопка должна по разному работать в разных случаях? Например, на этапе первого кадра нажатие кнопки Stop должно просто останавливать VI, а вот на этапе третьего кадра уже выполнять некоторые действия перед закрытием, как закрытие разных каналов, деактивировании контроллеров и прочее.
Архитектура - наше все...
Ваши фреймы - это состояния системы. При чем, с точными условиями перехода из состояния в состояние. Почему нельзя использовать Producer-Consumer Queued State Machine паттерн? Верхний цикл - обрабатывает нажатия кнопок, и посылает их во второй цикл. А во втором цикле определяете, что нужно делать - создайте енум с названиями состояния системы, и в стейте на обработку нажатия той или иной кнопки, при помощи енума и кейс-структуры определяйте, какое действие нужно делать. И тогда на кнопку можно вешать сколько угодно различных сценариев; главное - правильно определять, в каком состоянии находится Ваша система...
Ведь тут все просто - либо "простота" кода, но никакой его "расширяемости", либо чуточку побольше кода, но намного больше пространства для добавления/изменения/обновления функционала; как мне кажется...
Мы делили апельсин - много наших полегло...
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Лицевая панель»