Event structure. Баг

Простейшие вопросы в области инженерной разработки
Ответить
Аватара пользователя
Juri
I/O
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Event structure. Баг

Сообщение Juri »

Забавная фигня, довольно не очевидно, что оказывается нельзя в разные кейсы вставлять Event structure, которые работают от одного события или кнопки. Это приводит к зависанию.
В примере надо несколько раз нажимать Пуск и в диалоге Назад. Состояние start запускается только один раз за все время, тем не менее эвент структура в старте в дальнейшем вешает всю программу.
Вложения
Main.vi
(11.67 КБ) 128 скачиваний
Sub dialog.vi
(14.38 КБ) 116 скачиваний
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Event structure. Баг

Сообщение Borjomy_1 »

С чего баг-то? Принцип DataFlow никто не отменял. Если вы поставите таймаут на эвент структуру в старте, то все пройдет дальше.
P.s программу не смотрел. Нет у меня LV2015.
Аватара пользователя
Juri
I/O
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Event structure. Баг

Сообщение Juri »

timeout не помогает
вот для VL14
Вложения
Main.vi
(8.47 КБ) 112 скачиваний
Sub dialog.vi
(10.14 КБ) 108 скачиваний
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Event structure. Баг

Сообщение Borjomy_1 »

Можно спросить, зачем вы в Sub dialog напихали Event Palette для каждого состояния? Причем, поставили таймаут только для одной, которую программа проскакивает и на следующей итерации встает на второй.
Функционал подпрограммы похож на ожидание нажатия на кнопку. Вообще непонятно, зачем такое городить. При том, что функция First Call дает True только при первом вызове, т.е при втором сдвиговый регистр остается неинициализированным. Достаточно этого:
Вложения
Ожидание нажатия кнопки.png
Ожидание нажатия кнопки.png (17.68 КБ) 5818 просмотров
Аватара пользователя
Juri
I/O
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Event structure. Баг

Сообщение Juri »

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

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Event structure. Баг

Сообщение dadreamer »

Это не баг. Просто надо хорошенько разобраться, как работает эта структура, и внимательно прочитать справку.
Caveats and Recommendations when Using Events in LabVIEW
Обязательно по ссылкам пройдитесь и разберитесь в каждом пункте. Особенно в первом - он у вас как раз не выполняется. Пункт весьма неоднозначный. Вот эту тему прочтите: http://www.labviewportal.org/viewtopic. ... 994#p69994 Лично я принципиально избегаю помещения Event Structure в Case Structure. А эвент в эвент вообще не помещается, потому что в этом нет смысла. Даже While внутри другого While - излишество.
Blackman

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

Re: Event structure. Баг

Сообщение Blackman »

Вложения
TLB Event Handler.png
TLB – Top Level Baseline.ppt
(353 КБ) 95 скачиваний
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Event structure. Баг

Сообщение dadreamer »

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.
Blackman

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

Re: Event structure. Баг

Сообщение Blackman »

Основная идея автора шаблона (Norman Kirchner) в простом способе добавления, редактирования и группирования событий по типу.
В предлагаемом примере:
1. Добавьте обработку события для контрола Boalean в обоих Loops. Почувствовали разницу?)
2. Измените наименования (labels) всех зарегистрированных для событий контролов. Как видите в нижнем Loop ничего редактировать не надо, а в верхнем придется редактировать селектор в Case Structure.
Вложения
TLB Events Example.png
TLB Events Example LV13.vi
(20.7 КБ) 107 скачиваний
Аватара пользователя
Kosist

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

Re: Event structure. Баг

Сообщение Kosist »

Blackman писал(а):Основная идея автора шаблона (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. Ибо чем решение проще - тем лучше, т.к. его легче понять и поменять (и проще - не означает "решение в лоб").
Но это лишь мое субъективное мнение..
Мы делили апельсин - много наших полегло...
Blackman

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

Re: Event structure. Баг

Сообщение Blackman »

3. Замените контрол String на контрол Path.
По поводу динамической регистрации. В шаблоне это используется в первую очередь для генерации команды Cache User Parameters , а назначение вложенной ES указано в комментарии и она может содержать всего одно событие Timeout)))
Upd: По архитектуре шаблона - к автору. Адрес его почты есть в открытом доступе.
Аватара пользователя
Kosist

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

Re: Event structure. Баг

Сообщение Kosist »

Blackman писал(а):3. Замените контрол String на контрол Path.
Согласно логике примера кода, на странице обработки Value Change строки будет вывод этой строки в String Indicator (может и нет, но вполне возможно, т.к. то же самое происходит с Numeric и Boolean элементами).
Тогда в случае замены String Control на Path Control, обработчик события придется менять как в первом, так и во втором цикле...
Мы делили апельсин - много наших полегло...
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Event structure. Баг

Сообщение dadreamer »

Blackman писал(а):Основная идея автора шаблона (Norman Kirchner) в простом способе добавления, редактирования и группирования событий по типу.
В предлагаемом примере:
1. Добавьте обработку события для контрола Boalean в обоих Loops. Почувствовали разницу?)
2. Измените наименования (labels) всех зарегистрированных для событий контролов. Как видите в нижнем Loop ничего редактировать не надо, а в верхнем придется редактировать селектор в Case Structure.
По моим субъективным ощущениям - стало чуточку проще, но диаграмма стала заметно сложнее. Тому, кто не знаком с подобной техникой, она покажется непонятной. Уже не говорю о тех, кто с эвентами не работал в :labview: . Вообще, считаю, что делать из стандартных событий ещё и User Event - излишество и пустая трата времени. Есть же событие Value Change - создаём кадр, выбираем контрол, назначаем событие. Надо другой контрол обработать - делаем по аналогии. Для нескольких однотипных контролов делаем так, как в примере в верхнем цикле реализовано. И просто, и не так долго. А что даст экономия 5-10 секунд на каждый контрол?
Изображение

Ещё насторожило то, что последний коммит был аж в 2014 году. Видимо, проект не пользуется популярностью (вряд ли это тот случай, когда проект идеален и больше нечего улучшать).
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»