Приложения
Приложение А. Функции, константы и структуры RDS
А.5. Сервисные функции и макросы RDS
А.5.13. Вызов функций блоков
А.5.13.10. rdsQueueCallBlockFunction – отложенный вызов функции блока
Функция rdsQueueCallBlockFunction ставит указанную функцию указанного блока в очередь на выполнение. После этого управление немедленно возвращается модели вызвавшего функцию блока, а поставленная в очередь функция будет вызвана только после завершения этой модели.
void RDSCALL rdsQueueCallBlockFunction( RDS_BHANDLE Block, // Вызываемый блок int FuncId, // Идентификатор функции LPVOID pParamBuf, // Указатель на область параметров функции DWORD ParamBufSize, // Размер области параметров DWORD Flags // Флаги (RDS_BCALL_*) );
Тип указателя на эту функцию
RDS_VBhIpVDwDw
Параметры
- Block (RDS_BHANDLE)
- Идентификатор блока, функция которого будет вызвана (модель этого блока будет реагировать на событие RDS_BFM_FUNCTIONCALL).
- FuncId (int)
- Целый идентификатор вызываемой функции, полученный при ее регистрации вызовом rdsRegisterFunction.
- pParamBuf (LPVOID)
- Указатель на область параметров функции, которая будет скопирована во внутреннюю память RDS. Область параметров не должна содержать внутри себя какие-либо указатели на другие области памяти и объекты. Может равняться NULL.
- ParamBufSize (DWORD)
- Размер (в байтах) области параметров, указатель на которую передан в pParams.
- vv (DWORD)
- Один или несколько объединенных битовым ИЛИ флагов, управляющих вызовом функции:
RDS_BCALL_CHECKSUPPORT Перед вызовом проверить поддержку этой функции блоком, вызвав его модель для реакции на событие RDS_BFM_CHECKFUNCSUPPORT. В настоящее время этот режим практически не используется. RDS_BCALL_FIRST Поставить вызов функции блока в начало очереди (не может использоваться одновременно с RDS_BCALL_LAST). RDS_BCALL_LAST Поставить вызов функции блока в конец очереди (не может использоваться одновременно с RDS_BCALL_FIRST).
Примечания
Вызов этой функции приводит к постановке вызова модели блока Block для реакции на событие RDS_BFM_FUNCTIONCALL в начало или конец (в зависимости от флагов) специальной очереди. Вызовы функций из этой очереди будут выполнены последовательно после завершения модели вызвавшего функцию блока. Когда модель блока Block будет вызвана в режиме RDS_BFM_FUNCTIONCALL, поля структуры данных функции RDS_FUNCTIONCALLDATA, указатель на которую передается в модель блока в параметре ExtParam, будут заполнены следующим образом:
| Поле | Значение |
|---|---|
| int Function | значение параметра FuncId |
| LPVOID Data | указатель на внутреннюю область памяти RDS размером в ParamBufSize байтов, в которую скопирована область pParamBuf |
| RDS_BHANDLE Caller | идентификатор блока, из модели которого вызвана rdsCallBlockFunctionDelayed |
| BOOL Broadcast | FALSE |
| int BroadcastCnt | 0 |
| BOOL Stop | FALSE |
| BOOL Delayed | TRUE |
| DWORD DataBufSize | значение параметра ParamBufSize |
В отличие от прямого вызова функции блока, при отложенном вызове модели вызванного блока передается не указатель на область параметров функции, а указатель на копию этой области, сделанную RDS (именно поэтому при отложенном вызове всегда указывается размер области параметров и требуется, чтобы эта область не содержала указателей). Поскольку вызов функции будет выполнен уже после завершения модели вызвавшего блока, оригинальная область параметров на момент вызова может быть уже уничтожена, но сделанная RDS копия останется в памяти до фактического вызова функции блока.
Пример
Пример использования функции rdsQueueCallBlockFunction приведен в §2.13.5 руководства программиста.
См. также
RDS_BFM_FUNCTIONCALL, RDS_FUNCTIONCALLDATA, rdsCallBlockFunction, rdsCallBlockFunctionDelayed, rdsBroadcastFunctionCallsEx, rdsRegisterFunction.