Отлов событий только в одном Event Structure
-
- assistant
- Сообщения: 118
- Зарегистрирован: 05 ноя 2020, 08:26
- Версия LabVIEW: 18, 20.0f1
- Благодарил (а): 23 раза
- Поблагодарили: 4 раза
- Контактная информация:
Отлов событий только в одном Event Structure
Схематичная часть программы на скрине. Есть сервер, который работает во внешнем Event Structure, в том числе группа эвентов в нём отвечает за редактор текстовых файлов. Основная функция сервера - передача данных по протоколу UDP, во время которого тоже планируется дать возможность пользоваться редактором. Я установил в обе эти структуры одинаковые эвенты. Проблема в том, что при отлове внутренних эвентов, даже при указании максимум 1 в очереди, при остановке отправки по UDP внешний Event Structure тоже начинает выполнять всю очередь эвентов. У меня получилось это исправить только прибегая к костылям в виде дополнительных переменных-флагов и кучи кейсов, и это всё только для одного эвента, а их много, и в этом легко запутаться. Можно ли очищать эту очередь, или как-то отдельно выделить работу редактора внутри программы? Спасибо.
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Отлов событий только в одном Event Structure
Во-первых, цикл внутри евента - злостное зло.
Во-вторых, если ван не нужно ловить событие в конкртеной структуре, накой вы его там зарегистрировали?
Суть задумки я не понял, но вам явно надо переосознать архитектуру вашего приложения.
Во-вторых, если ван не нужно ловить событие в конкртеной структуре, накой вы его там зарегистрировали?
Суть задумки я не понял, но вам явно надо переосознать архитектуру вашего приложения.
-
- assistant
- Сообщения: 118
- Зарегистрирован: 05 ноя 2020, 08:26
- Версия LabVIEW: 18, 20.0f1
- Благодарил (а): 23 раза
- Поблагодарили: 4 раза
- Контактная информация:
Re: Отлов событий только в одном Event Structure
1. Так и не смог найти объяснение, почему. И как иначе реализовать сервер с несколькими функциями? Или сделать кучу циклов while, каждый из которых будет крутиться до тех пор, пока нужная кнопка не будет нажата? Пока сложно представляется.
2. Мне нужно ловить его в обоих структурах, но если оно будет поймано во внутренней, при выходе из эвента оно продублируется.
Например, запустил я передачу данных, захотел в это время отредактировать файл, нажал кнопку, внутренний эвент сработал, открылось окошко с редактором, поработал. И сразу после того, как я останавливаю передачу, у меня снова открывается редактор, т.к. внешняя структура тоже ловит событие. Вот этого и хотелось бы избежать.
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Отлов событий только в одном Event Structure
Так и не смог найти разъяснение вопроса: почему что?
Вы бы разъяснили суть своего сервера. Пока плохо понятно, что вы пытаетесь соорудить.И как иначе реализовать сервер с несколькими функциями?
Изучите матчастьИли сделать кучу циклов while, каждый из которых будет крутиться до тех пор, пока нужная кнопка не будет нажата? Пока сложно представляется.
ОДИН цикл занят работой с пользователем. Всё долгоиграющее исполняется в других циклах, куда пересылается соответствущий запрос.
не находите противоречие?2. Мне нужно ловить его в обоих структурах, но если оно будет поймано во внутренней, при выходе из эвента оно продублируется.
"Мне нужно ловить его в обоих структурах" и "при выходе из эвента оно продублируется"
Вы добились того, что хотели - отлов в обоих структурах, а теперь не довольны этим фактом.
События - это почти как очередь, но на много получателей, т.е каждый подписавшийся (register for events) начинает получать свою копию событий. И это НЕ очередь. Если один получатель очистил свою копию очереди, то остальным это вообще по барабану, они продолжают обрабатывать всю очередь.
Один цикл занимается передачей данных, второй, совершенно независимый от него - работа редактора, третий - интерфейс главного окна. И так дальше, сколько угодно компонентов, которые должны исполняться параллельно. На каждую кнопку, естественно, не нужно свой отдельный цикл городить.Например, запустил я передачу данных, захотел в это время отредактировать файл, нажал кнопку, внутренний эвент сработал, открылось окошко с редактором, поработал. И сразу после того, как я останавливаю передачу, у меня снова открывается редактор, т.к. внешняя структура тоже ловит событие. Вот этого и хотелось бы избежать.
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
Re: Отлов событий только в одном Event Structure
Попробуйте открыть стандартный шаблон проекта в Labview "Queued Message Handler" и разобраться, как он работает. К нему есть подробное описание и комментарии внутри кода.
https://www.ni.com/ru-ru/support/docume ... bview.html
Поймете, как NI предлагает использовать обработку событий, потом уже можете взять или более сложный шаблон или доработать этот под свои задачи. Главное понять общую идею. В нем один цикл обрабатывает события интерфейса и передает команды и данные через очередь в другие циклы и сами циклы могут обмениваться сообщениями. В шаблоне один цикл, но их может быть множество.
У вас по ощущениям этот шаблон вывернут наизнанку, от этого и все проблемы.
Ну и как правильно сказали выше, без четкого понимания задачи предложить какое-то конкретное решение очень сложно, а от архитектуры проекта зависит очень много. И надежность работы и возможность модернизации и понимания кода другими программистами.
https://www.ni.com/ru-ru/support/docume ... bview.html
Поймете, как NI предлагает использовать обработку событий, потом уже можете взять или более сложный шаблон или доработать этот под свои задачи. Главное понять общую идею. В нем один цикл обрабатывает события интерфейса и передает команды и данные через очередь в другие циклы и сами циклы могут обмениваться сообщениями. В шаблоне один цикл, но их может быть множество.
У вас по ощущениям этот шаблон вывернут наизнанку, от этого и все проблемы.
Ну и как правильно сказали выше, без четкого понимания задачи предложить какое-то конкретное решение очень сложно, а от архитектуры проекта зависит очень много. И надежность работы и возможность модернизации и понимания кода другими программистами.
-
- assistant
- Сообщения: 118
- Зарегистрирован: 05 ноя 2020, 08:26
- Версия LabVIEW: 18, 20.0f1
- Благодарил (а): 23 раза
- Поблагодарили: 4 раза
- Контактная информация:
Re: Отлов событий только в одном Event Structure
Почему цикл в внутри эвента - злостное зло.
Изучите матчасть
ОДИН цикл занят работой с пользователем. Всё долгоиграющее исполняется в других циклах, куда пересылается соответствущий запрос.
Большое спасибо, видимо как раз этого мне и не хватало изначально, буду изучать.Andrew Lunev писал(а): ↑21 авг 2021, 20:48 Попробуйте открыть стандартный шаблон проекта в Labview "Queued Message Handler" и разобраться, как он работает. К нему есть подробное описание и комментарии внутри кода.
https://www.ni.com/ru-ru/support/docume ... bview.html
Поймете, как NI предлагает использовать обработку событий, потом уже можете взять или более сложный шаблон или доработать этот под свои задачи. Главное понять общую идею. В нем один цикл обрабатывает события интерфейса и передает команды и данные через очередь в другие циклы и сами циклы могут обмениваться сообщениями. В шаблоне один цикл, но их может быть множество.
У вас по ощущениям этот шаблон вывернут наизнанку, от этого и все проблемы.
Ну и как правильно сказали выше, без четкого понимания задачи предложить какое-то конкретное решение очень сложно, а от архитектуры проекта зависит очень много. И надежность работы и возможность модернизации и понимания кода другими программистами.
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Отлов событий только в одном Event Structure
Именно потому, что вы получаете такие проблемы. Наружный цикл ловит события, даже если вы думаете, что он бездействует. И если внутренний цикл ушёл в глубокую задумчивость, то наружный не может продолжить работу и обработать новые события.
Вот притянутый за уши пример. Внешний цикл не может остановиться, пока внутренний не закончит работу. А он в некоторых случаях её не может закончить, например, если в настройках указано "блокировать панель до обработки", то экран оказывается заблокирован и нажать "правильную" кнопку уже не получится.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение