Event structure. Баг

Простейшие вопросы в области инженерной разработки

Event structure. Баг

Postby Usss on 21 Sep 2017, 13:48

Забавная фигня, довольно не очевидно, что оказывается нельзя в разные кейсы вставлять Event structure, которые работают от одного события или кнопки. Это приводит к зависанию.
В примере надо несколько раз нажимать Пуск и в диалоге Назад. Состояние start запускается только один раз за все время, тем не менее эвент структура в старте в дальнейшем вешает всю программу.
Attachments
Main.vi
(11.67 KiB) Downloaded 18 times
Sub dialog.vi
(14.38 KiB) Downloaded 18 times
Usss
beginner
beginner
 
Posts: 41
Joined: 19 Apr 2017, 23:06
LabVIEW Version: 2015
Karma: 10

Re: Event structure. Баг

Postby Borjomy_1 on 21 Sep 2017, 15:18

С чего баг-то? Принцип DataFlow никто не отменял. Если вы поставите таймаут на эвент структуру в старте, то все пройдет дальше.
P.s программу не смотрел. Нет у меня LV2015.
Borjomy_1
expert
expert
 
Posts: 1761
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 309
VIP

Re: Event structure. Баг

Postby Usss on 21 Sep 2017, 15:30

timeout не помогает
вот для VL14
Attachments
Main.vi
(8.47 KiB) Downloaded 17 times
Sub dialog.vi
(10.14 KiB) Downloaded 11 times
Usss
beginner
beginner
 
Posts: 41
Joined: 19 Apr 2017, 23:06
LabVIEW Version: 2015
Karma: 10

Re: Event structure. Баг

Postby Borjomy_1 on 21 Sep 2017, 15:50

Можно спросить, зачем вы в Sub dialog напихали Event Palette для каждого состояния? Причем, поставили таймаут только для одной, которую программа проскакивает и на следующей итерации встает на второй.
Функционал подпрограммы похож на ожидание нажатия на кнопку. Вообще непонятно, зачем такое городить. При том, что функция First Call дает True только при первом вызове, т.е при втором сдвиговый регистр остается неинициализированным. Достаточно этого:
Attachments
Ожидание нажатия кнопки.png
Ожидание нажатия кнопки.png (17.68 KiB) Viewed 571 times
Borjomy_1
expert
expert
 
Posts: 1761
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 309
VIP

Re: Event structure. Баг

Postby Usss on 21 Sep 2017, 16:42

В моей программе на первом этапе пользователь вводит пароль, на втором идет различная обработка данных. В примере ничего этого нет. Я решил проблему тем, что просто создал отдельную кнопку выхода для другого эвент кейса
Usss
beginner
beginner
 
Posts: 41
Joined: 19 Apr 2017, 23:06
LabVIEW Version: 2015
Karma: 10

Re: Event structure. Баг

Postby dadreamer on 21 Sep 2017, 18:40

Это не баг. Просто надо хорошенько разобраться, как работает эта структура, и внимательно прочитать справку.
Caveats and Recommendations when Using Events in LabVIEW
Обязательно по ссылкам пройдитесь и разберитесь в каждом пункте. Особенно в первом - он у вас как раз не выполняется. Пункт весьма неоднозначный. Вот эту тему прочтите: viewtopic.php?p=69994#p69994 Лично я принципиально избегаю помещения Event Structure в Case Structure. А эвент в эвент вообще не помещается, потому что в этом нет смысла. Даже While внутри другого While - излишество.
User avatar
dadreamer
doctor
doctor
 
Posts: 2858
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 704
I/O VIP vision internet

Re: Event structure. Баг

Postby Blackman on 22 Sep 2017, 00:11

Attachments
TLB Event Handler.png
TLB – Top Level Baseline.ppt
(353 KiB) Downloaded 13 times
Blackman
leader
leader
 
Posts: 672
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 166

Re: Event structure. Баг

Postby dadreamer on 22 Sep 2017, 00:44

Blackman, в чём смысл подобного подхода? Разве нельзя обрабатывать все события в основной структуре? Или, на худой конец, вынести вложенную структуру в отдельный цикл. Кроме явного сопоставления одного UE другому больше не вижу плюсов. А минусы расписывать нет желания - проходили уже.
Avoid Placing Two Event Structures in One Loop
...
To avoid hanging the user interface with front panel locking, configure all events you want a VI to handle in a single Event structure or always make sure there is only one Event structure in a While Loop. Additionally, make sure there is always an Event structure available to handle events as they occur.

Use Only One Event Structure whenever Possible
You can use multiple Event structures in the same VI, especially if you register events dynamically. However, events that you register statically rarely require multiple Event structures, so use one Event structure to handle events whenever possible.

When you use multiple Event structures in the same VI, observe the following guidelines:

Place each Event structure in its own While Loop.
Ensure that the Event structures execute simultaneously.
Ensure that the Event structures stop handling events simultaneously.
User avatar
dadreamer
doctor
doctor
 
Posts: 2858
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 704
I/O VIP vision internet

Re: Event structure. Баг

Postby Blackman on 22 Sep 2017, 19:57

Основная идея автора шаблона (Norman Kirchner) в простом способе добавления, редактирования и группирования событий по типу.
В предлагаемом примере:
1. Добавьте обработку события для контрола Boalean в обоих Loops. Почувствовали разницу?)
2. Измените наименования (labels) всех зарегистрированных для событий контролов. Как видите в нижнем Loop ничего редактировать не надо, а в верхнем придется редактировать селектор в Case Structure.
Attachments
TLB Events Example.png
TLB Events Example LV13.vi
(20.7 KiB) Downloaded 17 times
Blackman
leader
leader
 
Posts: 672
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 166

Re: Event structure. Баг

Postby Kosist on 23 Sep 2017, 01:12

Blackman wrote:Основная идея автора шаблона (Norman Kirchner) в простом способе добавления, редактирования и группирования событий по типу.
В предлагаемом примере:
1. Добавьте обработку события для контрола Boalean в обоих Loops. Почувствовали разницу?)
2. Измените наименования (labels) всех зарегистрированных для событий контролов. Как видите в нижнем Loop ничего редактировать не надо, а в верхнем придется редактировать селектор в Case Structure.

ИМХО, довольно сомнительные преимущества.
Группирование событий по типу? Это поможет лишь для визуального восприятия кода, т.к. все равно события обрабатываются по отдельности - будь то лейбл, или отдельная страница Event Structure.
Добавление событий - второй вариант по затратам времени и усилий тот же, что и традиционное добавление новой страницы ивент структуры. Но здесь все это нужно делать во вложенной ивент структуре (зачем городить больше)?
Вешать Value Change на Dynamic Registration - более целесообразно в случае динамической обработки событий, т.е. когда мы точно не знаем, что будет нажато, но можем прописать ожидаемые варианты. А так - лишь добавляет лишних "проводков" на блок диаграмме. Пример: главная виайка запускает динамически другие виайки, "собирает" с них референсы на контролы, и обрабатывает их события через динамические события. И тогда первый цикл более выгодный тоже, т.к. выбор страницы Case Structure намного легче сделать динамическим (привязка не просто к лейблу, а к его маске, типу данных контрола, и т.д.), нежели второй цикл, где нужно создавать страницы во вложенной Event Structure.
Ну, и архитектура - наше все.
Например, на лицевой панели имеется пять одинаковых групп из 10 индикаторов. И нужно отображать на них данные, которые приходят из параллельного процесса. Кто-то будет решать вопрос "в лоб", и создаст 50 индикаторов на фронт панели, создавая далее структуру по типу первого цикла (а может, не дай Бог, и второго) а кто-то сделает 5 subpanel, одну виайку с индикаторами, и запустит это как 5 параллельных процессов. Да, больше работы. Но если нужно будет добавить еще одну группу, или убрать - работы намного меньше, чем в случае "прямого" решения.
Евент структура в евент структуре - значит что-то не так с кодом, design smells. Ибо чем решение проще - тем лучше, т.к. его легче понять и поменять (и проще - не означает "решение в лоб").
Но это лишь мое субъективное мнение..
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 763
Joined: 21 Feb 2011, 23:44
Location: СумГУ
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 225
CLAD I/O VIP students

Re: Event structure. Баг

Postby Blackman on 23 Sep 2017, 11:17

3. Замените контрол String на контрол Path.
По поводу динамической регистрации. В шаблоне это используется в первую очередь для генерации команды Cache User Parameters , а назначение вложенной ES указано в комментарии и она может содержать всего одно событие Timeout)))
Upd: По архитектуре шаблона - к автору. Адрес его почты есть в открытом доступе.
Blackman
leader
leader
 
Posts: 672
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 166

Re: Event structure. Баг

Postby Kosist on 23 Sep 2017, 15:38

Blackman wrote:3. Замените контрол String на контрол Path.

Согласно логике примера кода, на странице обработки Value Change строки будет вывод этой строки в String Indicator (может и нет, но вполне возможно, т.к. то же самое происходит с Numeric и Boolean элементами).
Тогда в случае замены String Control на Path Control, обработчик события придется менять как в первом, так и во втором цикле...
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 763
Joined: 21 Feb 2011, 23:44
Location: СумГУ
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 225
CLAD I/O VIP students

Re: Event structure. Баг

Postby dadreamer on 23 Sep 2017, 20:30

Blackman wrote:Основная идея автора шаблона (Norman Kirchner) в простом способе добавления, редактирования и группирования событий по типу.
В предлагаемом примере:
1. Добавьте обработку события для контрола Boalean в обоих Loops. Почувствовали разницу?)
2. Измените наименования (labels) всех зарегистрированных для событий контролов. Как видите в нижнем Loop ничего редактировать не надо, а в верхнем придется редактировать селектор в Case Structure.

По моим субъективным ощущениям - стало чуточку проще, но диаграмма стала заметно сложнее. Тому, кто не знаком с подобной техникой, она покажется непонятной. Уже не говорю о тех, кто с эвентами не работал в :labview: . Вообще, считаю, что делать из стандартных событий ещё и User Event - излишество и пустая трата времени. Есть же событие Value Change - создаём кадр, выбираем контрол, назначаем событие. Надо другой контрол обработать - делаем по аналогии. Для нескольких однотипных контролов делаем так, как в примере в верхнем цикле реализовано. И просто, и не так долго. А что даст экономия 5-10 секунд на каждый контрол?
Image

Ещё насторожило то, что последний коммит был аж в 2014 году. Видимо, проект не пользуется популярностью (вряд ли это тот случай, когда проект идеален и больше нечего улучшать).
User avatar
dadreamer
doctor
doctor
 
Posts: 2858
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 704
I/O VIP vision internet


Return to Для чайников

Who is online

Users browsing this forum: Bing [Bot], Yandex and 9 guests

cron