Работа с событиями
Интерфейс событий не был завершен в Firebird 4.0, мы ожидаем, что вследующей версии будет что-то более интересное. Минимальная существующаяподдержка выглядит следующим образом:IAttachment
содержит методqueEvents()
, который выполняет почти те же функции, что и вызовisc_que_events()
. Вместо пары параметров FPTR_EVENT_CALLBACK ast
иvoid* arg
, необходимых для вызова кода пользователя, когда в Firebirdпроисходит событие, используется интерфейс обратного вызоваIEventCallback
. Это традиционный подход, который помогает избежатьнебезопасных бросков из void* в пользовательской функции. Другое важноеразличие заключается в том, что вместо идентификатора события (видаобработчика) эта функция возвращает ссылку на интерфейсIEvents
, имеющий метод cancel()
,используемый для остановки ожидании события. В отличие отидентификатора, который уничтожается автоматически при поступлениисобытия, интерфейс не может быть уничтожен автоматически, если событиеполучено непосредственно перед вызовом метода cancel()
, то это вызоветsegfault из-за того, что интерфейс уже будет уничтожен. Поэтому послеполучения события интерфейс IEvents
должен быть явно освобождён. Это может быть сделано, например, прямоперед запросом события из очереди в следующий раз:
events->release();
events = NULL;
events = attachment->queEvents(&status, this, eveLen, eveBuffer);
Установка указателя интерфейса в NULL
полезна в случае возникновенияисключения в queEvents
. В других аспектах обработка событий неизменилась по сравнению с ISC API. Для получения дополнительнойинформации используйте наш пример 08.events.cpp
.