Отлов событий только в одном Event Structure

Простейшие вопросы в области инженерной разработки
Ответить
Sergey Puzanov
assistant
assistant
Сообщения: 118
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 23 раза
Поблагодарили: 4 раза
Контактная информация:

Отлов событий только в одном Event Structure

Сообщение Sergey Puzanov »

Схематичная часть программы на скрине. Есть сервер, который работает во внешнем Event Structure, в том числе группа эвентов в нём отвечает за редактор текстовых файлов. Основная функция сервера - передача данных по протоколу UDP, во время которого тоже планируется дать возможность пользоваться редактором. Я установил в обе эти структуры одинаковые эвенты. Проблема в том, что при отлове внутренних эвентов, даже при указании максимум 1 в очереди, при остановке отправки по UDP внешний Event Structure тоже начинает выполнять всю очередь эвентов. У меня получилось это исправить только прибегая к костылям в виде дополнительных переменных-флагов и кучи кейсов, и это всё только для одного эвента, а их много, и в этом легко запутаться. Можно ли очищать эту очередь, или как-то отдельно выделить работу редактора внутри программы? Спасибо.
Схема.png
Artem.spb

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

Re: Отлов событий только в одном Event Structure

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

Во-первых, цикл внутри евента - злостное зло.
Во-вторых, если ван не нужно ловить событие в конкртеной структуре, накой вы его там зарегистрировали?
Суть задумки я не понял, но вам явно надо переосознать архитектуру вашего приложения.
Sergey Puzanov
assistant
assistant
Сообщения: 118
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 23 раза
Поблагодарили: 4 раза
Контактная информация:

Re: Отлов событий только в одном Event Structure

Сообщение Sergey Puzanov »

Artem.spb писал(а): 20 авг 2021, 15:55 Во-первых, цикл внутри евента - злостное зло.
Во-вторых, если ван не нужно ловить событие в конкртеной структуре, накой вы его там зарегистрировали?
Суть задумки я не понял, но вам явно надо переосознать архитектуру вашего приложения.
1. Так и не смог найти объяснение, почему. И как иначе реализовать сервер с несколькими функциями? Или сделать кучу циклов while, каждый из которых будет крутиться до тех пор, пока нужная кнопка не будет нажата? Пока сложно представляется.
2. Мне нужно ловить его в обоих структурах, но если оно будет поймано во внутренней, при выходе из эвента оно продублируется.
Например, запустил я передачу данных, захотел в это время отредактировать файл, нажал кнопку, внутренний эвент сработал, открылось окошко с редактором, поработал. И сразу после того, как я останавливаю передачу, у меня снова открывается редактор, т.к. внешняя структура тоже ловит событие. Вот этого и хотелось бы избежать.
Artem.spb

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

Re: Отлов событий только в одном Event Structure

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

Sergey Puzanov писал(а): 21 авг 2021, 08:32 1. Так и не смог найти объяснение, почему.
Так и не смог найти разъяснение вопроса: почему что?
И как иначе реализовать сервер с несколькими функциями?
Вы бы разъяснили суть своего сервера. Пока плохо понятно, что вы пытаетесь соорудить.
Или сделать кучу циклов while, каждый из которых будет крутиться до тех пор, пока нужная кнопка не будет нажата? Пока сложно представляется.
Изучите матчасть
ОДИН цикл занят работой с пользователем. Всё долгоиграющее исполняется в других циклах, куда пересылается соответствущий запрос.
2. Мне нужно ловить его в обоих структурах, но если оно будет поймано во внутренней, при выходе из эвента оно продублируется.
не находите противоречие?
"Мне нужно ловить его в обоих структурах" и "при выходе из эвента оно продублируется"
Вы добились того, что хотели - отлов в обоих структурах, а теперь не довольны этим фактом.
События - это почти как очередь, но на много получателей, т.е каждый подписавшийся (register for events) начинает получать свою копию событий. И это НЕ очередь. Если один получатель очистил свою копию очереди, то остальным это вообще по барабану, они продолжают обрабатывать всю очередь.
Например, запустил я передачу данных, захотел в это время отредактировать файл, нажал кнопку, внутренний эвент сработал, открылось окошко с редактором, поработал. И сразу после того, как я останавливаю передачу, у меня снова открывается редактор, т.к. внешняя структура тоже ловит событие. Вот этого и хотелось бы избежать.
Один цикл занимается передачей данных, второй, совершенно независимый от него - работа редактора, третий - интерфейс главного окна. И так дальше, сколько угодно компонентов, которые должны исполняться параллельно. На каждую кнопку, естественно, не нужно свой отдельный цикл городить.
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: Отлов событий только в одном Event Structure

Сообщение Andrew Lunev »

Попробуйте открыть стандартный шаблон проекта в Labview "Queued Message Handler" и разобраться, как он работает. К нему есть подробное описание и комментарии внутри кода.
https://www.ni.com/ru-ru/support/docume ... bview.html

Поймете, как NI предлагает использовать обработку событий, потом уже можете взять или более сложный шаблон или доработать этот под свои задачи. Главное понять общую идею. В нем один цикл обрабатывает события интерфейса и передает команды и данные через очередь в другие циклы и сами циклы могут обмениваться сообщениями. В шаблоне один цикл, но их может быть множество.
У вас по ощущениям этот шаблон вывернут наизнанку, от этого и все проблемы.

Ну и как правильно сказали выше, без четкого понимания задачи предложить какое-то конкретное решение очень сложно, а от архитектуры проекта зависит очень много. И надежность работы и возможность модернизации и понимания кода другими программистами.
Sergey Puzanov
assistant
assistant
Сообщения: 118
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 23 раза
Поблагодарили: 4 раза
Контактная информация:

Re: Отлов событий только в одном Event Structure

Сообщение Sergey Puzanov »

Artem.spb писал(а): 21 авг 2021, 16:47 Так и не смог найти разъяснение вопроса: почему что?
Почему цикл в внутри эвента - злостное зло.

Изучите матчасть
ОДИН цикл занят работой с пользователем. Всё долгоиграющее исполняется в других циклах, куда пересылается соответствущий запрос.
Andrew Lunev писал(а): 21 авг 2021, 20:48 Попробуйте открыть стандартный шаблон проекта в Labview "Queued Message Handler" и разобраться, как он работает. К нему есть подробное описание и комментарии внутри кода.
https://www.ni.com/ru-ru/support/docume ... bview.html

Поймете, как NI предлагает использовать обработку событий, потом уже можете взять или более сложный шаблон или доработать этот под свои задачи. Главное понять общую идею. В нем один цикл обрабатывает события интерфейса и передает команды и данные через очередь в другие циклы и сами циклы могут обмениваться сообщениями. В шаблоне один цикл, но их может быть множество.
У вас по ощущениям этот шаблон вывернут наизнанку, от этого и все проблемы.

Ну и как правильно сказали выше, без четкого понимания задачи предложить какое-то конкретное решение очень сложно, а от архитектуры проекта зависит очень много. И надежность работы и возможность модернизации и понимания кода другими программистами.
Большое спасибо, видимо как раз этого мне и не хватало изначально, буду изучать.
Artem.spb

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

Re: Отлов событий только в одном Event Structure

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

Sergey Puzanov писал(а): 23 авг 2021, 08:10 Почему цикл в внутри эвента - злостное зло.
Именно потому, что вы получаете такие проблемы. Наружный цикл ловит события, даже если вы думаете, что он бездействует. И если внутренний цикл ушёл в глубокую задумчивость, то наружный не может продолжить работу и обработать новые события.
Вот притянутый за уши пример. Внешний цикл не может остановиться, пока внутренний не закончит работу. А он в некоторых случаях её не может закончить, например, если в настройках указано "блокировать панель до обработки", то экран оказывается заблокирован и нажать "правильную" кнопку уже не получится.
events.png
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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