User Event

Обсуждение, связанное с разработкой ПО верхнего уровня

User Event

Postby IvanLis on 25 Aug 2018, 00:21

Кто использует в своих проектах User Event подскажите насколько они надежны и как правильно их использовать.
По идее User Event должно дойти до всех приемников, которые должны ее обработать.
Но при работе возникает баг, который хорошо воспроизводится (OS-Linux, LV2016 64-bit).
Сделал два цикла обрабатывающих одно и тоже событие, по нажатии кнопки next, значение должно быть увеличено на 1.
Но при последовательности нажатий с разной частотой, количество зарегистрированных событий одним приемником отличается от другого.
В реальном проекте события будут обрабатываться в разных SubVI, по этому обычный Event не подходит.
Кто, что посоветует?

UserEvent-lv2016.vi
(21.59 KiB) Downloaded 17 times

UserEvent-lv2010 save from 2016.vi
(12.72 KiB) Downloaded 14 times
User avatar
IvanLis
professor
professor
 
Posts: 4656
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 735
hardware VIP bloggers teachers

Re: User Event

Postby IvanLis on 25 Aug 2018, 09:15

Добавил классическую обработку события в оба цикла. Получается, что событие вообще может быть не обработано :cry:
Снимок экрана от 2018-08-25 09-08-53.png

Пока вывод: использовать User Event для передачи важных сообщений и информации нельзя, т.к. возможен пропуск события!
User avatar
IvanLis
professor
professor
 
Posts: 4656
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 735
hardware VIP bloggers teachers

Re: User Event

Postby dadreamer on 25 Aug 2018, 11:06

User avatar
dadreamer
professor
professor
 
Posts: 3157
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 803
I/O VIP vision internet

Re: User Event

Postby IvanLis on 25 Aug 2018, 13:52

dadreamer, огромное спасибо!
Все не так плохо, как мне показалось.
Если регистрировать события для каждого обработчика отдельно, то все работает без пропусков.
Попробовал даже с 1ms интервалом запустить.
Снимок экрана от 2018-08-25 13-21-50.png
One Reg User Event -> Fault

Снимок экрана от 2018-08-25 13-20-47.png
Individual Reg User Event -> Ok

Снимок экрана от 2018-08-25 13-29-05.png
1ms User Event -> Ok
User avatar
IvanLis
professor
professor
 
Posts: 4656
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 735
hardware VIP bloggers teachers

Re: User Event

Postby dadreamer on 25 Aug 2018, 13:57

IvanLis wrote:Кто использует в своих проектах User Event подскажите насколько они надежны и как правильно их использовать.

Я время от времени использую их в своих программах. Не так, чтобы супер часто (всё-таки очереди и уведомители - number 1), но порой пригождаются. Например, для передачи событий из главного :vi: в подпрограммы, где также крутятся Event структуры. Ни разу нареканий к ним не имел (при условии правильного использования, конечно). :)

ЗЫ: для нижнего цикла Unregister тоже нужен.
User avatar
dadreamer
professor
professor
 
Posts: 3157
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 803
I/O VIP vision internet

Re: User Event

Postby IvanLis on 25 Aug 2018, 14:20

dadreamer wrote:для нижнего цикла Unregister тоже нужен.

Ага, переделывал, упустил...

Я всегда Queue использую, там удобно и последовательностью управлять и если что просмотреть все элементы в буфере можно.
Бывают пустяковые задачи, но для которых приходится создавать несколько очередей (для каждой SubVI), потом из основного цикла посылать сообщение каждой очереди индивидуально... И все только ради нескольких событий GUI, на которые отзыв всех (или) нескольких SubVI.
User avatar
IvanLis
professor
professor
 
Posts: 4656
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 735
hardware VIP bloggers teachers

Re: User Event

Postby dadreamer on 25 Aug 2018, 14:40

IvanLis wrote:Бывают пустяковые задачи, но для которых приходится создавать несколько очередей (для каждой SubVI), потом из основного цикла посылать сообщение каждой очереди индивидуально... И все только ради нескольких событий GUI, на которые отзыв всех (или) нескольких SubVI.

Можно сделать две очереди - в одну сторону (в SubVI) и в другую (в Main VI). А в самом сообщении прописывать адресата. Например, "Прибор1:График1:Очистка". Spreadsheet String в этом случае очень помогает. Те SubVI, кому это не предназначено, просто проигнорируют.

А насчёт UE: можно, конечно, заменить их на очередь или уведомитель с логическим параметром. Но иногда бывает нужно, чтобы событие было отловлено именно в Event Structure, а не в каком-то постороннем цикле While (например, работа с (G)UI, чтобы все Property/Invoke Nodes находились в одном месте и не переключали в UI Thread другие циклы).
User avatar
dadreamer
professor
professor
 
Posts: 3157
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 803
I/O VIP vision internet

Re: User Event

Postby IvanLis on 25 Aug 2018, 17:16

dadreamer wrote:Можно сделать две очереди - в одну сторону (в SubVI) и в другую (в Main VI). А в самом сообщении прописывать адресата. Например, "Прибор1:График1:Очистка". Spreadsheet String в этом случае очень помогает. Те SubVI, кому это не предназначено, просто проигнорируют.

С одной стороны логично, но... :think:
А есть какой-нибудь пример "учебно-боевой", а то не совсем понятна идея.

Если использовать для чтения Dequeue Element, потом его анализировать и если он не предназначен для данного цикла (SubVI), дублировать его снова в очередь... В этом случае нарушается очередность команд, да и когда он дойдет до адресата неизвестно.

Более правильно, это просматривать элемент перед его чтением используя Preview Queue Element, анализировать и в случае совпадения адресатов делать Dequeue Element. В этом случае цикл обрабатывающий сообщения поступающие с низкой интенсивностью будет получать их с большой задержкой (пока не подойдет его сообщение, а это может быть через 1000 элементов). Ну и парсить команды приходится неоднократно.

Можно конечно использовать Get Queue Status, просматривать всю очередь в поиске своего сообщения, но удалить конкретный элемент из очереди нельзя (я по крайней мере не знаю как), а если очищать очередь и повторно в нее отправлять все ненужные (предназначенные другим циклам).... это тоже не малые накладные расходы, да и возникает задержка в доставке. Да и не исключена ситуация, что между считыванием всех элементов очереди до ее очистки, какой-нибудь из циклов выдернет из нее сообщение и обработает, а потом обработает еще раз (после ретранслции) ... и как это обернется х.з.

И в конце концов, если потребуется остановить N циклов, то все равно придется отправлять каждому команду индивидуально, только в одной очереди.
User avatar
IvanLis
professor
professor
 
Posts: 4656
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 735
hardware VIP bloggers teachers

Re: User Event

Postby Blackman on 25 Aug 2018, 20:00

Это уже было лет 6 тому назад): LabVIEW User Events Tips, Tricks, and Sundry
https://github.com/wirebirdlabs/LabVIEW ... and-Sundry
Один пример из этой презентации.
Attachments
04 - Demonstration - Effect of Branching Event Registration.vi
LabVIEW 2013
(22.92 KiB) Downloaded 21 times
Blackman
leader
leader
 
Posts: 803
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 234
VIP

Re: User Event

Postby dadreamer on 25 Aug 2018, 22:02

IvanLis wrote:Можно конечно использовать Get Queue Status, просматривать всю очередь в поиске своего сообщения, но удалить конкретный элемент из очереди нельзя (я по крайней мере не знаю как), а если очищать очередь и повторно в нее отправлять все ненужные (предназначенные другим циклам).... это тоже не малые накладные расходы, да и возникает задержка в доставке.

Ну, если в программе не несколько сотен циклов и на каждый не приходится по паре сотен команд, то будет вполне себе исправно работать. (В списке команд можно выбрать несколько пунктов с помощью клавиши Ctrl).
Queue_Cmd.vi
lv2016
(32.27 KiB) Downloaded 25 times

Циклы достаточно быстро разбирают сообщения, если конечно их не нагрузить какими-нибудь "тяжёлыми" операциями, чтобы само по себе не очень правильно. Ну, понятно, что на каждый цикл своя очередь - более элегантный и простой подход. Или можно сделать строковый UE вместо очереди и не парить мозг.
IvanLis wrote:Да и не исключена ситуация, что между считыванием всех элементов очереди до ее очистки, какой-нибудь из циклов выдернет из нее сообщение и обработает, а потом обработает еще раз (после ретранслции) ... и как это обернется х.з.

Можно поставить семафор на подобный случай (см. пример). Хотя :labview: внутри как-то всё равно разделяет одновременный доступ к одной очереди (м.б., мьютекс ставится, не копался).
IvanLis wrote:И в конце концов, если потребуется остановить N циклов, то все равно придется отправлять каждому команду индивидуально, только в одной очереди.

Именно для остановки циклов я уже много лет применяю логический уведомитель. Никогда не подводил. Изредка (в асинхронно вызываемых SubVI) использую логический UE, т.к. иногда бывает нужно остановить/закрыть SubVI чуть раньше, чем остановится Main VI.
User avatar
dadreamer
professor
professor
 
Posts: 3157
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 803
I/O VIP vision internet

Re: User Event

Postby Blackman on 26 Aug 2018, 14:33

Есть такая библиотека -
NI Qbus v1.0.0.2 by National Instruments
Released On: Thu, 19 May 2016 16:26:03 -0500
Author: National Instruments
Copyright: Copyright (c) 2016, National Instruments
License: NI Sample Code License
Compatible LabVIEW Versions: >= 2015.
Compatible OS Versions: ALL.
Repository Name: NI LabVIEW Tools Network
Description:
NI Qbus is a LabVIEW based messaging API. The library provides VIs for sharing messages between asynchronous processes. The Qbus API provides subVIs that allow processes to send two types of messages:
Broadcast messages—Available to any process. The sender does not specify a recipient for a broadcast message. To receive a specific type of broadcast message, each process registers for the messages it desires by name.
Routed messages—Sent only to a specific, named process. You might send a routed message when multiple processes register for a particular message name, but in a specific situation, you only want one specific process to receive and handle the message.

Пример ее применения (первоисточник от dadreamer ) :wink:
Attachments
Blackman--Qbus_Example.png
Blackman--Qbus_Example.vi
(49.74 KiB) Downloaded 21 times
Blackman
leader
leader
 
Posts: 803
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 234
VIP

Re: User Event

Postby Kosist on 26 Aug 2018, 15:05

IvanLis wrote:Кто использует в своих проектах User Event подскажите насколько они надежны и как правильно их использовать.

Ни разу не испытывал проблем с ними. Терять пакеты они в принципе не могут, т.к. User Event работает как и очередь, по принципу FIFO. Но, Вам уже и так сказали, что было неправильно в том примере...
Их отлично применять тогда, когда надо делать broadcast сообщения - например, остановка всех модулей; т.к. User Event может иметь Multiple Writers/Multiple Readers, в то время как для корректной работы очереди нужно иметь лишь одного "читателя".
В своих проектах я их использую для остановки Helper Loop в акторах - родительский актор содержит инициализацию юзер-события в Pre-Launch Init.vi; в Stop Core.vi посылается сообщения, а затем ссылка закрывается; и эта же ссылка доступна во всех дочерних классах - если нужно, можно "вытянуть" ее, и использовать для остановки цикла в Actor Core.vi.
Есть еще крутая библиотека Stream, при помощи которой можно делать абстракцию любого основного канала передачи данных в :labview:.
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 900
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 253
CLAD I/O VIP students

Re: User Event

Postby IvanLis on 26 Aug 2018, 16:31

Blackman wrote:Есть такая библиотека -
NI Qbus v1.0.0.2 by National Instruments


Это ближе к "телу".
Посмотрел исходники, там в принципе неявно для пользователя создаются отдельные очереди для каждого процесса (Listener Process), что позволяет исключить все недостатки о которых я ранее писал.
Добавить пару функций в стиле Enqueue Element At Opposite End для широковещательной и индивидуальной рассылки и будет совсем хорошо.
Останется один минус, это то что команды в String, а не Enum Type Def которые позволяют исключить ряд ошибок.
User avatar
IvanLis
professor
professor
 
Posts: 4656
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 735
hardware VIP bloggers teachers

Re: User Event

Postby taras_33 on 26 Aug 2018, 20:39

родительский актор содержит инициализацию юзер-события в Pre-Launch Init.vi; в Stop Core.vi посылается сообщения, а затем ссылка закрывается;

Такой же техникой пользуюсь и я.
Создаем...
Pre Launch.png
Pre Launch.png (6.25 KiB) Viewed 830 times


Генерируем событие, останавливая циклы с user event - ами
Stop Core.png
Stop Core.png (5.11 KiB) Viewed 830 times

Все "детки" и старшие и младшие наследуются от этого класса. Достаточно удобно.

Есть еще крутая библиотека Stream

Библиотека действительно крутая 130 мб весит
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
User avatar
taras_33
developer
developer
 
Posts: 256
Joined: 31 Oct 2009, 18:25
Location: Minsk -> Miami
Medals: 1
Activity (1)
LabVIEW Version: 2016
Karma: 121
CLD VIP

Re: User Event

Postby Blackman on 26 Aug 2018, 23:18

IvanLis wrote:...
Останется один минус, это то что команды в String, а не Enum Type Def которые позволяют исключить ряд ошибок.

Это осознанный выбор. Упрощает интеграцию Qbus c различными процессами, которые как правило имеют различные наборы команд. Как это делают в NI можно посмотреть например в следующих библиотеках (есть в VIPM):
NI Blink Process Library
https://forums.ni.com/t5/Reference-Desi ... -p/3537109
NI Timer Process Library
https://forums.ni.com/t5/Reference-Desi ... -p/3537108
Если есть предпочтение использования Enum Type Def, то достаточно в библиотеке процесса сделать wrappers для Qbus :vi: c Enum Type Def на входе и выходе.
Для отлова ошибок команд (не реализована, ошибки синтаксиса и т.д.), как правило используется Default case. Но например в NI Timer Process Library это правило не выполняется :dntknw:
Blackman
leader
leader
 
Posts: 803
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 234
VIP


Return to Лицевая панель

Who is online

Users browsing this forum: No registered users and 5 guests

cron