Asynchronous call
-
- developer
- Сообщения: 289
- Зарегистрирован: 26 фев 2016, 06:31
- Версия LabVIEW: 18-20
- Благодарил (а): 6 раз
- Поблагодарили: 7 раз
- Контактная информация:
Asynchronous call
Добрый день! Asynchronous call - всплывает окно, где в него через user event идут данные из основного main.vi.
Вопрос в следующем, если цикл, который шлет данные будет делать чаще, чем цикл принимающий (например долгая обработка), то данные будут копиться (все данные из основного цикла не нужны), тогда напрашивается использовать очередь например или уведомитель. Как тогда обрабатывать события в принимающем цикле? С user event вроде удобно, ничего лишнего плодить не нужно - тут же можно обрабатывать и внутренние события и внешние. Как все-таки правильнее?
пример прилагаю
Вопрос в следующем, если цикл, который шлет данные будет делать чаще, чем цикл принимающий (например долгая обработка), то данные будут копиться (все данные из основного цикла не нужны), тогда напрашивается использовать очередь например или уведомитель. Как тогда обрабатывать события в принимающем цикле? С user event вроде удобно, ничего лишнего плодить не нужно - тут же можно обрабатывать и внутренние события и внешние. Как все-таки правильнее?
пример прилагаю
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 173 раза
- Контактная информация:
Re: Asynchronous call
Очередь напрашивается НЕ использовать. Она копит посылки точно так же, как события.
Так что, если данные нудно "терять", то или нотификаторы, или глобальные переменные. Если нужен цикл обработки событий, то делайте параллельный цикл, который будет заниматься обработкой посылок.
Закрыть его можно по ошибке того самого нотификатора или по доп. событию. К тому же нет необходимости все сообщения во всплывающие окна отправлять через один канал. Можно данные гнать через нотификаторы, а служебные команды через те же события.
-
- developer
- Сообщения: 289
- Зарегистрирован: 26 фев 2016, 06:31
- Версия LabVIEW: 18-20
- Благодарил (а): 6 раз
- Поблагодарили: 7 раз
- Контактная информация:
Re: Asynchronous call
Очередь события копит, но всегда можно отправлять данные во всплывающее окно (на основе приложенного примера), если длина очереди например не более 1. С user event такого не сделаешь я так понимаю. Вопрос то в чем, если все таки использовать единичную очередь, как обрабатывать внутренние события, ещё один цикл городить?
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 173 раза
- Контактная информация:
Re: Asynchronous call
Если окон много, то очередь совершенно не подходит. Это канал "от многих к одному", а не наоборот.
События можно чистить, если уж на то пошло. А в наличии нескольких параллельных циклов в рамках одного VI нет ничего страшного или противоестественного.
События можно чистить, если уж на то пошло. А в наличии нескольких параллельных циклов в рамках одного VI нет ничего страшного или противоестественного.
-
- developer
- Сообщения: 289
- Зарегистрирован: 26 фев 2016, 06:31
- Версия LabVIEW: 18-20
- Благодарил (а): 6 раз
- Поблагодарили: 7 раз
- Контактная информация:
Re: Asynchronous call
Это vi всплывающего окна, в которую данные идут извне. В первом все через user event (тут же обработка событий самой vi) - по коду минимум - все удобно, во втором через очередь (в единичную очередь добавляется позиция если она пуста)+отдельный цикл для обработки событий - его тоже надо закрывать извне - в общем код сильно больше
Какой вариант все-таки предпочтительнее из 2-х, и кто как это реализует?
Какой вариант все-таки предпочтительнее из 2-х, и кто как это реализует?
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 173 раза
- Контактная информация:
Re: Asynchronous call
Простота кода - вовсе не самоцель. Главной целью должна быть надёжность программы и удобство пользователя.
Снова повторю: ничего "ужасного" в двух циклах нет, это нормально, вы ещё Actor-ы не видели :)
Вообще говоря, обработка данных и действий пользователя должны быть в разных циклах. Особенно, если эта обработка (как и в вашем случае) занимает много времени.
Если прям очень плохо от двух циклов, приреживайте "очередь" событий, как я показал.
А в остальном - два цикла: один с пользователем общается, второй все команды обрабатывает.
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 173 раза
- Контактная информация:
- jane_wild
- master
- Сообщения: 459
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 83 раза
- Поблагодарили: 15 раз
- Контактная информация:
Re: Asynchronous call
Если имя очереди известно управляйте как угодно (посылайте команды из других VI уничтожайте очередь и т.д.)
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 173 раза
- Контактная информация:
Re: Asynchronous call
Да. Я обычно делаю один "finish" на всех, все на него подписаны и завершают работу по команде.
Можно городить не из вне, а создать его локально, и генерировать по завершению нижнего.