Occurrences: недокументированные возможности

ActiveX, .NET, DLL
Ответить
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Occurrences: недокументированные возможности

Сообщение dadreamer »

Решил создать вот такую тему по Occurrences. Эта информация может пригодиться для выполнения синхронизации собственной библиотеки с LabVIEW. В настоящее время :labview: предлагает крайне скудный функционал для синхронизации. Это пара функций: Occur и PostLVUserEvent. На самом деле в :labview: этих функций больше. Привожу здесь их прототипы и краткое описание работы.

Основные функции:

1. Occurrence AllocOccur(void);
Генерирует новый Occurrence. Это фактически аналог :vi: Generate Occurrence (палитра Synchronization -> Occurrences). Однако, в отличие от указанного :vi: , функция при каждом вызове создаёт новый уникальный Occurrence. :vi: Generate Occurrence не всегда возвращает уникальный Occurrence, а только когда ранее сгенерированный Occurrence был уничтожен.

2. MgErr DeallocOccur(Occurrence o);
Уничтожает заданный Occurrence.

3. uInt32 AllocOccurHdlr(Occurrence o, void *Callback_Func, void *User_Param_Ptr)
Создаёт новый обработчик для указанного Occurrence и привязывает к обработчику пользовательскую функцию. Данная функция будет вызываться при срабатывании Occurrence. Прототип у функции следующий: void Callback_Func(void *User_Param_Ptr);. User_Param_Ptr - это пользовательский параметр, который передаётся в callback-функцию. Может быть указателем на структуру с данными.

4. MgErr DeallocOccurHdlr(uInt32 Handler);
Уничтожает заданный обработчик Occurrence.

5. MgErr OnOccurrence(uInt32 Handler, uInt8 / LVBoolean IgnorePrevious);
Активирует ожидание срабатывания заданного обработчика Occurrence. Это неполный аналог :vi: Wait On Occurrence. Только в данном случае ожидание выполняется не в пользовательском коде, а при помощи внутреннего механизма :labview: . При активированном ожидании и срабатывании Occurrence вызывается пользовательская функция Callback_Func. Без вызова OnOccurrence пользовательская функция не вызовется.

6. MgErr CancelOnOccur(uInt32 Handler);
Отменяет ожидание срабатывания Occurrence, активированное ранее с помощью OnOccurrence или OnOccurrenceWithTimeout.

7. MgErr OnOccurrenceWithTimeout(uInt32 Handler, uInt8 / LVBoolean IgnorePrevious, int32 to);
Активирует ожидание срабатывания заданного обработчика Occurrence. По сути полный аналог :vi: Wait On Occurrence. Таймаут ожидания задаётся в миллисекундах. Может быть равен -1, что означает бесконечное ожидание. При наступлении таймаута, также как и при срабатывании Occurrence, вызывается пользовательская функция Callback_Func.

8. uInt8 / LVBoolean HandlerTimedOut(uInt32 Handler);
Возвращает True, если произошёл таймаут при ожидании Occurrence, активированном ранее с помощью OnOccurrenceWithTimeout.

9. MgErr Occur(Occurrence o);
Стандартная функция LabVIEW, аналог :vi: Set Occurrence. Приводит к срабатыванию заданного Occurrence. При срабатывании вызывается пользовательская функция Callback_Func.

10. MgErr OccurAtTime(Occurrence o, uInt32 t);
Приводит к срабатыванию заданного Occurrence в указанное время t. Время задаётся в "тиках" системного таймера (мс). Новый вызов функции переписывает ранее заданное время. Отменить срабатывание Occurrence можно с помощью уничтожения этого Occurrence, либо функцией CancelOccurAtTime (см. описание!).

11. MgErr CancelOccurAtTime(Occurrence o);
Отменяет срабатывание Occurrence по таймеру, активированное ранее с помощью OccurAtTime. Функция присутствует только в mgcore_SH_*_0.dll, в самом :labview: её нет. Это означает, что в RTE этой функции также не будет, потому лучше пользоваться этой функцией исключительно для отладки. А ещё лучше вообще её не использовать.

12. void OccurIfValid(Occurrence o);
Приводит к срабатыванию заданного Occurrence, если он действителен (является Magic Cookie), т.е. не был уничтожен ранее с помощью DeallocOccur.

13. MgErr FireOccurHdlr(uInt32 Handler);
Аналог Occur, но не приводит к срабатыванию Occurrence, если функция вызвана до активации ожидания срабатывания этого Occurrence (т.е. эффект такой же, как при параметре IgnorePrevious = True для OnOccurrence / OnOccurrenceWithTimeout). После вызова функции устанавливается флаг таймаута (HandlerTimedOut возвращает True).

Прочие функции (практически бесполезные):

1. MgErr BindOccurHdlr(uInt32 NewCookie, Occurrence o, void *Callback_Func, void *User_Param_Ptr);
Привязывает к обработчику Occurrence пользовательскую функцию Callback_Func. Вызывается внутри AllocOccurHdlr. Также требует в качестве входного параметра объект Magic Cookie, который становится обработчиком Occurrence.

2. uInt32 AllocOccurHdlrStrict(Occurrence o, void *Callback_Func, void *User_Param_Ptr);
Полный аналог AllocOccurHdlr, за тем исключением, что для флага таймаута используется другое базовое значение во внутренней структуре LabVIEW. Для стандартного обработчика могут быть установлены такие флаги:
0 - таймаута нет
1 - активировано ожидание с помощью OnOccurrenceWithTimeout
2 - таймаут
Для обработчика, созданного с помощью AllocOccurHdlrStrict, флаги становятся такими:
4 - таймаута нет
5 - активировано ожидание с помощью OnOccurrenceWithTimeout
6 - таймаут

3. MgErr OnOccurrenceWithTimeoutForExec(uInt32 Handler, uInt8 / LVBoolean IgnorePrevious, int32 to, void *QEtopElement);
Полный аналог OnOccurrenceWithTimeout. По-видимому, имеет смысл только в контексте LV Execution System. Назначение последнего параметра не понятно.

4. MgErr OnOccurrenceAndOccurAtTimeForExec(uInt32 Handler, uInt8 / LVBoolean IgnorePrevious, Occurrence o, uInt32 t, void *QEtopElement);
Полный аналог связки OnOccurrence + OccurAtTime. По-видимому, имеет смысл только в контексте LV Execution System. Назначение последнего параметра не понятно.

5. uInt32 AllocThreadSafeOccurHdlr(Occurrence o, void *Callback_Func, void *User_Param_Ptr);
Полный аналог AllocOccurHdlr, но, судя по имени, генерирует потокобезопасный обработчик. В чём именно потокобезопасность заключается, не понятно. Присутствует только в mgcore_SH_*_0.dll.

6. Остальные внутренние функции из mgcore_SH_*_0.dll (без разбора):
ValidOccurrence
LVBoolean ChkOccurrences(void);
ChkThGroupOccurrences
GetOccurrenceManagerMainThreadGroupIndex
OccurrenceManagerService
GetOccurrenceManagerAsyncArea
SetOccurrenceManagerMainThreadGroupIndex


Проверить работу основных функций по работе с Occurrence можно даже с БД в :labview: . Для этого я сделал вот такой пример:
Occurrences_Test.rar
lv2010 + D7
(74.74 КБ) 257 скачиваний
При инициализации программы в качестве обработчика Occurrence регистрируется пользовательская функция OC_Callback (см. исходник OCTest.dll). Эта функция вызывается при каждом срабатывании Occurrence. Кроме того, функция генерирует случайное целое число и отправляет его в :labview: с помощью PostLVUserEvent (в виде строки). Это число также записывается по указателю UserParam. В :labview: выводится и полученная строка с числом, и содержимое указателя UserParam, чтобы можно было сравнить оба числа и убедиться, что они одинаковы.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приложениями»