Asynchronous call

Простейшие вопросы в области инженерной разработки
Ответить
rushonda
adviser
adviser
Сообщения: 231
Зарегистрирован: 26 фев 2016, 06:31
Версия LabVIEW: 18-20
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Asynchronous call

Сообщение rushonda »

Добрый день! Asynchronous call - всплывает окно, где в него через user event идут данные из основного main.vi.
Вопрос в следующем, если цикл, который шлет данные будет делать чаще, чем цикл принимающий (например долгая обработка), то данные будут копиться (все данные из основного цикла не нужны), тогда напрашивается использовать очередь например или уведомитель. Как тогда обрабатывать события в принимающем цикле? С user event вроде удобно, ничего лишнего плодить не нужно - тут же можно обрабатывать и внутренние события и внешние. Как все-таки правильнее?
пример прилагаю
Вложения
Graph.vi
(25.03 КБ) 12 скачиваний
Main.vi
(19.07 КБ) 11 скачиваний
Artem.spb

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

Re: Asynchronous call

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

rushonda писал(а): 11 мар 2021, 12:42 напрашивается использовать очередь например или уведомитель. Как тогда обрабатывать события в принимающем цикле?
Очередь напрашивается НЕ использовать. Она копит посылки точно так же, как события.
Так что, если данные нудно "терять", то или нотификаторы, или глобальные переменные. Если нужен цикл обработки событий, то делайте параллельный цикл, который будет заниматься обработкой посылок.
Закрыть его можно по ошибке того самого нотификатора или по доп. событию. К тому же нет необходимости все сообщения во всплывающие окна отправлять через один канал. Можно данные гнать через нотификаторы, а служебные команды через те же события.
rushonda
adviser
adviser
Сообщения: 231
Зарегистрирован: 26 фев 2016, 06:31
Версия LabVIEW: 18-20
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Asynchronous call

Сообщение rushonda »

Очередь события копит, но всегда можно отправлять данные во всплывающее окно (на основе приложенного примера), если длина очереди например не более 1. С user event такого не сделаешь я так понимаю. Вопрос то в чем, если все таки использовать единичную очередь, как обрабатывать внутренние события, ещё один цикл городить?
Artem.spb

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

Re: Asynchronous call

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

Если окон много, то очередь совершенно не подходит. Это канал "от многих к одному", а не наоборот.
События можно чистить, если уж на то пошло.
e.png
e.png (13.19 КБ) 234 просмотра
А в наличии нескольких параллельных циклов в рамках одного VI нет ничего страшного или противоестественного.
rushonda
adviser
adviser
Сообщения: 231
Зарегистрирован: 26 фев 2016, 06:31
Версия LabVIEW: 18-20
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Asynchronous call

Сообщение rushonda »

Это vi всплывающего окна, в которую данные идут извне. В первом все через user event (тут же обработка событий самой vi) - по коду минимум - все удобно, во втором через очередь (в единичную очередь добавляется позиция если она пуста)+отдельный цикл для обработки событий - его тоже надо закрывать извне - в общем код сильно больше
Какой вариант все-таки предпочтительнее из 2-х, и кто как это реализует?
Вложения
ex.png
Artem.spb

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

Re: Asynchronous call

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

rushonda писал(а): 15 мар 2021, 14:13 в общем код сильно больше
Простота кода - вовсе не самоцель. Главной целью должна быть надёжность программы и удобство пользователя.
Снова повторю: ничего "ужасного" в двух циклах нет, это нормально, вы ещё Actor-ы не видели :)
Вообще говоря, обработка данных и действий пользователя должны быть в разных циклах. Особенно, если эта обработка (как и в вашем случае) занимает много времени.
Если прям очень плохо от двух циклов, приреживайте "очередь" событий, как я показал.
А в остальном - два цикла: один с пользователем общается, второй все команды обрабатывает.
Artem.spb

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

Re: Asynchronous call

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

Кстати, вот тут классика жанра - правильный стиль программирования и как раз два цикла
Using Event Structure.jpg
rushonda
adviser
adviser
Сообщения: 231
Зарегистрирован: 26 фев 2016, 06:31
Версия LabVIEW: 18-20
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Asynchronous call

Сообщение rushonda »

как бы вы закрыли циклы извне?
Artem.spb

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

Re: Asynchronous call

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

rushonda писал(а): 15 мар 2021, 17:35 как бы вы закрыли циклы извне?
ровно так, как закрывается нижний цикл
Аватара пользователя
jane_wild
adviser
adviser
Сообщения: 234
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 18 раз
Поблагодарили: 2 раза

Re: Asynchronous call

Сообщение jane_wild »

rushonda писал(а): 15 мар 2021, 17:35 как бы вы закрыли циклы извне?
Если имя очереди известно управляйте как угодно (посылайте команды из других VI уничтожайте очередь и т.д.)
Queue.png
Queue.png (1.03 КБ) 154 просмотра
rushonda
adviser
adviser
Сообщения: 231
Зарегистрирован: 26 фев 2016, 06:31
Версия LabVIEW: 18-20
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Asynchronous call

Сообщение rushonda »

С нижним понятно.
Верхний как закрыть извне, городить user event?
Artem.spb

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

Re: Asynchronous call

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

rushonda писал(а): 15 мар 2021, 19:12 С нижним понятно.
Верхний как закрыть извне, городить user event?
Да. Я обычно делаю один "finish" на всех, все на него подписаны и завершают работу по команде.
Можно городить не из вне, а создать его локально, и генерировать по завершению нижнего.
rushonda
adviser
adviser
Сообщения: 231
Зарегистрирован: 26 фев 2016, 06:31
Версия LabVIEW: 18-20
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Asynchronous call

Сообщение rushonda »

Ясно, спасибо
Ответить

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