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

Обсуждение, связанное с разработкой ПО верхнего уровня

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

Postby dmitrii2209 on 10 Feb 2016, 22:49

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

Понимаю, что картина очень неполная, но может быть есть идеи, из-за чего это может происходить и куда копать? Я раньше с таким не сталкивался и даже не знаю, с какой подступать стороны.
dmitrii2209
beginner
beginner
 
Posts: 17
Joined: 26 Jun 2015, 13:10
LabVIEW Version: 14.0
Karma: 0

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

Postby Kosist on 11 Feb 2016, 00:59

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

Извините, если сумбурно, но, опять же, без кода тяжело сказать, что не так...
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 817
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 238
CLAD I/O VIP students

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

Postby dmitrii2209 on 11 Feb 2016, 01:23

Спасибо за ответ, но всё не туда, как мне кажется.
1. Разные обработчики (Event Structure) нужно использовать в разные моменты времени, поэтому они у меня в разных кадрах. Раньше я по неопытности создавал много обработчиков в одном месте, но всё работало.
2. Потому, что иногда нам всё-таки не нужно реагировать на нажатие кнопки. В этом случае мы выбираем "Mouse Down?" и к терминалу Disable подводим соответствующего буля. Но здесь дело вряд ли в этом, ибо с такими событиями я раньше работал и проблем не возникало. Впрочем, попробую завтра сократить использование "Mouse Down?".
3. Там ничего не выполняется.
4. Цикл реагирует на нажатие proceed. Кстати говоря, вот именно этот кадр, содержащий такой же цикл был у меня в предыдущей версии VI, где таких проблем не возникало.
5. Switch when pressed везде.
Ещё идей подкинете?
dmitrii2209
beginner
beginner
 
Posts: 17
Joined: 26 Jun 2015, 13:10
LabVIEW Version: 14.0
Karma: 0

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

Postby Kosist on 11 Feb 2016, 01:37

Не поленился, набросал похожий примерчик. Теперь все ясно :crazy:
Нужно убирать с событий галочки "Lock Panel", тогда все будет работать (на скрине галочка активна, ее-то и нужно убрать). А так, мне кажется, Вы жмете на кнопку, для которой нет обработчика в первом фрейме, и Event Structure в замешательстве, и блокирует фронт-панель.
Объяснение так себе, но решение должно работать - надеюсь :wink:
Attachments
Event Structure.png
Events.png
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 817
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 238
CLAD I/O VIP students

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

Postby Blackman on 11 Feb 2016, 02:41

Если то, что я подглядел в предыдущем сообщении правда, можно смело претендовать на новый паттерн варинга)
Attachments
Stop VI or Hierarchy.PNG
Stop VI or Hierarchy.vi
(15.01 KiB) Downloaded 71 times
Blackman
leader
leader
 
Posts: 716
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 187

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

Postby Artem.spb on 11 Feb 2016, 06:40

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


dmitrii2209 wrote:Спасибо за ответ, но всё не туда, как мне кажется.
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 в разделе событий.
Artem.spb
expert
expert
 
Posts: 1295
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 224
CLD hardware I/O VIP freelance

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

Postby dmitrii2209 on 11 Feb 2016, 17:58

Правильно ли я понимаю, что если даже EventStructure расположена в кадре, который ещё не начал выполняться (либо уже выполнился в прошлом), она реагирует на Event'ы, описанные в ней так, как ей положено?
Да, кажется это так. Поработаю над перестройкой блок схемы. Мне кажется нелогичным, вообще говоря, учёт структуры, находящейся в неактивном блоке, но, видимо, в NI со мной по какой-то причине не согласны.
Отпишусь по результатам экспериментов с блок-схемой.
dmitrii2209
beginner
beginner
 
Posts: 17
Joined: 26 Jun 2015, 13:10
LabVIEW Version: 14.0
Karma: 0

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

Postby Artem.spb on 11 Feb 2016, 20:05

dmitrii2209 wrote:. Мне кажется нелогичным, вообще говоря, учёт структуры, находящейся в неактивном блоке, но, видимо, в NI со мной по какой-то причине не согласны..

что тут нелогичного?
каким мистическим образом event структура должна догадаться, что она уже или ещё не активна?
она есть, события зарегистрированы в системе, значит они накапливаются.
Artem.spb
expert
expert
 
Posts: 1295
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 224
CLD hardware I/O VIP freelance

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

Postby dmitrii2209 on 11 Feb 2016, 20:21

Artem.spb wrote:что тут нелогичного?

То, что выполняется код из блока, до которого мы ещё не дошли.
Artem.spb wrote:каким мистическим образом event структура должна догадаться, что она уже или ещё не активна?

Никакой мистики. Если мы в том же кадре переменной, имевшей значение "10" назначим инкрементирование значения, она примет значение "11" не раньше и не позже, а именно в этом кадре. Процедура инкремента каким-то образом ведь догадывается, что настало её время. Чем обработчик событий хуже?
dmitrii2209
beginner
beginner
 
Posts: 17
Joined: 26 Jun 2015, 13:10
LabVIEW Version: 14.0
Karma: 0

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

Postby Kosist on 11 Feb 2016, 20:51

dmitrii2209 wrote:То, что выполняется код из блока, до которого мы ещё не дошли.

Но события не выполняются, они находятся в очереди. Когда выполнение дойдет до нужного кадра, тогда событие будет выполнено.
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 817
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 238
CLAD I/O VIP students

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

Postby IvanLis on 11 Feb 2016, 20:56

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

В Вашем случае регистрируются события GUI и пользователю все равно, чем в данный момент занимается программа (выполняет расчеты или ждет нажатия кнопки). Пользователь просто берет и нажимает, а программа, когда появится возможность, обрабатывает событие.
По этому, как правило, обработку событий GUI и вычислительную части, разносят в разные циклы.

Полистайте книгу "LabVIEW. Стиль программирования" Питер Блюм . Многое станет понятнее.
User avatar
IvanLis
professor
professor
 
Posts: 4563
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 721
hardware VIP bloggers teachers

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

Postby dmitrii2209 on 11 Feb 2016, 21:19

Kosist wrote:Но события не выполняются, они находятся в очереди. Когда выполнение дойдет до нужного кадра, тогда событие будет выполнено.

Правильно, события не выполняются, события регистрируется. Выполняется код, соответствующий событию.
Ведь если бы в третьем кадре не было вообще Event Structure, клики по соответствующим кнопкам игнорировались бы и FP не блокировался бы. Почему же не игнорируются события, обозначенные в неактуальном Event Structure? Я, конечно, понимаю, что наши представления о логичности могут различаться. И вот мне это кажется нелогичным.
IvanLis wrote:В Вашем случае регистрируются события GUI и пользователю все равно, в чем в данный момент занимается программа (выполняет расчеты или ждет нажатия кнопки). Пользователь просто берет и нажимает, а программа, когда появится возможность, обрабатывает событие.
По этому, как правило обработку событий GUI и вычислительную части, разносят в разные циклы.

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

А вот за книгу спасибо. Давно стоило почитать что-нибудь в этом духе.
dmitrii2209
beginner
beginner
 
Posts: 17
Joined: 26 Jun 2015, 13:10
LabVIEW Version: 14.0
Karma: 0

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

Postby IvanLis on 11 Feb 2016, 23:05

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

Обычно, для того, что бы предугадать неправильные действия пользователя, кнопки, которые он в данный момент не должен нажимать блокируются или скрываются. Для этого используются свойства disable и visible.
И так поступают во всех языках программирования, в том числе и текстовых. Например в Delphi событие button.click обработается независимо от этапа работы алгоритма программы.

dmitrii2209 wrote:Почему же не игнорируются события, обозначенные в неактуальном Event Structure? Я, конечно, понимаю, что наши представления о логичности могут различаться. И вот мне это кажется нелогичным.

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

Так что можете поразвлечься. Сделать так что бы в начальный момент были доступны только элементы обрабатываемые первой Event Structure. После того как пользователь выполнил необходимые действия и выполнил переход ко второй Event Structure, первая группа кнопок "закрывается", вторая "открывается" .... и т.д. и т.п.
User avatar
IvanLis
professor
professor
 
Posts: 4563
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 721
hardware VIP bloggers teachers

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

Postby dmitrii2209 on 12 Feb 2016, 00:46

IvanLis wrote:Обычно, для того, что бы предугадать неправильные действия пользователя, кнопки, которые он в данный момент не должен нажимать блокируются или скрываются. Для этого используются свойства disable и visible.

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

В данном случае речь шла о логике языка, а не о логике программы.
dmitrii2209
beginner
beginner
 
Posts: 17
Joined: 26 Jun 2015, 13:10
LabVIEW Version: 14.0
Karma: 0

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

Postby Kosist on 12 Feb 2016, 01:08

dmitrii2209 wrote:Но если одна кнопка должна по разному работать в разных случаях? Например, на этапе первого кадра нажатие кнопки Stop должно просто останавливать VI, а вот на этапе третьего кадра уже выполнять некоторые действия перед закрытием, как закрытие разных каналов, деактивировании контроллеров и прочее.

Архитектура - наше все...
Ваши фреймы - это состояния системы. При чем, с точными условиями перехода из состояния в состояние. Почему нельзя использовать Producer-Consumer Queued State Machine паттерн? Верхний цикл - обрабатывает нажатия кнопок, и посылает их во второй цикл. А во втором цикле определяете, что нужно делать - создайте енум с названиями состояния системы, и в стейте на обработку нажатия той или иной кнопки, при помощи енума и кейс-структуры определяйте, какое действие нужно делать. И тогда на кнопку можно вешать сколько угодно различных сценариев; главное - правильно определять, в каком состоянии находится Ваша система...
Ведь тут все просто - либо "простота" кода, но никакой его "расширяемости", либо чуточку побольше кода, но намного больше пространства для добавления/изменения/обновления функционала; как мне кажется...
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 817
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 238
CLAD I/O VIP students

Next

Return to Лицевая панель

Who is online

Users browsing this forum: No registered users and 3 guests

cron