Приложения
Приложение А. Функции, константы и структуры RDS
А.5. Сервисные функции и макросы RDS
А.5.3. Синхронизация потоков RDS
А.5.3.4. rdsUnlockAndCall – вызвать функцию, сняв блокировку данных
Функция rdsUnlockAndCall вызывает пользовательскую функцию, указатель на которую передается в ее первом параметре, снимая на время ее работы блокировку данных. Эту функцию можно вызывать только в главном потоке RDS.
BOOL RDSCALL rdsUnlockAndCall( RDS_IpV Func, // Функция пользователя LPVOID Param, // Параметр функции пользователя int *pResult // Результат возврата функции );
Тип указателя на эту функцию
RDS_BCb4pVI
Параметры
- Func (RDS_IpV)
- Указатель на пользовательскую функцию, которую нужно вызвать со снятой блокировкой данных.
Пользовательская функция должна иметь следующий вид:
int RDSCALL имя_функции(LPVOID param);
Тип этого параметра RDS_IpV описан в «RdsDef.h» как указатель на такую функцию:
typedef int (RDSCALL *RDS_IpV)(LPVOID);
- Param (LPVOID)
- Параметр типа void*, передаваемый в пользовательскую функцию при вызове.
- pResult (int*)
- Указатель на переменную, в которую будет записано целое значение, возвращенное пользовательской функцией. Если это значение не нужно, может быть равен NULL.
Возвращаемое значение
TRUE, если пользовательская функция выполнена, или FALSE, если вызов не выполнен из-за того, что rdsUnlockAndCall вызвана не в главном потоке, вместо указателя на функцию передано значение NULL или в пользовательской функции возникли исключения.
Примечания
Вызов rdsUnlockAndCall обычно используется для выполнения каких-либо длительных действий, не затрагивающих данные блоков, в главном потоке RDS. Типичный пример – открытие модального окна в режиме расчета из главного потока (например, в реакции блока на нажатие клавиши или кнопки мыши), этот случай рассматривается в §1.8 руководства программиста. Поскольку при вызове модели блока данные всегда блокируются, открытие модального окна приведет к остановке потока расчета: пока окно на экране, функция модели блока не завершится, и RDS не разблокирует данные, поэтому как только поток расчета попытается тоже заблокировать их, он перейдет в состояние ожидания. Чтобы избежать этого, нужно создать функцию специального вида, которая будет открывать модальное окно, после чего передать указатель на эту функцию в параметре Func вызова rdsUnlockAndCall.
При вызове rdsUnlockAndCall RDS выполняет следующие действия:
- Если вызвавший функцию поток – не главный поток RDS, функция немедленно возвращает FALSE.
- Блокировка данных полностью снимается – как при вызове rdsUnlockBlockData, но без учета внутреннего счетчика блокировок.
- Вызывается функция, указатель на которую передан в параметре Func, с параметром, переданным в параметре Param. Возвращенное функцией целое число запоминается.
- Блокировка данных восстанавливается, причем вместе с ней восстанавливается значение внутреннего счетчика блокировок функции rdsLockBlockData.
- Запомненный результат возврата вызванной функции записывается по указателю pResult, если этот указатель не равен NULL.
Поскольку на время выполнения пользовательской функции блокировка снимается, любые обращения к данным блоков и вызовы сервисных функций RDS следует окружать вызовами rdsLockBlockData/rdsUnlockBlockData.
Пример
Пример использования rdsUnlockAndCall рассматривается в §2.7.6 руководства программиста.
См. также