Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 2. Конспекты (02_04_19).rtf
Скачиваний:
65
Добавлен:
10.09.2019
Размер:
363.46 Кб
Скачать

§6. Синхронизация задач с помощью объектов ядра «таймер ожидания» (Waitable Timer).

Таймер ожидания — объект, который самостоятельно переходит в сигнальное состояние в определенное время или через регулярный промежуток времени.

Функция создания объекта ядра «таймер ожидания»

HANDLE CreateWaitableTimer(

IN LPSECURITY_ATTRIBUTES lpTAttr,

IN BOOL bManualReset,

IN LPCTSTR lpTimerName

);

Параметры и описание:

(1) lpTAttr — определяет указатель на структуру SECURITY_ATTRIBUTES. Если этот параметр равен NULL, дескриптор не может наследоваться дочерними процессами. Член этой структуры lpSecurityDescriptor определяет дескриптор безопасности для нового объекта. Если lpTAttr имеет значение NULL, объект получает дескриптор безопасности по умолчанию.

(2) bManualReset определяет тип таймера. TRUE — с ручным сбросом, FALSE — с автоматическим сбросом.

(3) lpTimerName — определяет имя таймера.

Возвращаемое значение.

Если функция завершилась успешно, она возвращает дескриптор объекта таймера, в противном случае — возвращает NULL.

Описание.

Таймер всегда создается в несигнальном состоянии и его необходимо после создания настроить.

Функция активации объекта ядра «ожидаемый таймер»

BOOL SetWaitableTimer(

IN HANDLE hTimer,

IN CONST LARGE_INTEGER* lpDueTime,

IN LONG lPeriod,

IN PTIMERAPCROUTINE pfnComplRoutine,

IN LPVOID lpArgToComplRoutine,

IN BOOL fResume,

);

Параметры и описание:

(1) hTimer — определяет дескриптор объекта таймера. Функция CreateWaitableTimer или OpenWaitableTimer возвращает этот дескриптор. Дескриптор должен иметь право доступа TIMER_MODIFY_STATE.

(2) lpDueTime определяет время, по истечении которого необходимо установить состояние таймера с интервалом 100 наносекунд. Используйте формат, описанный структурой FILETIME. Положительные значения указывают абсолютное время. Обязательно используйте абсолютное время в формате UTC, поскольку система использует внутреннее время в формате UTC. Отрицательные значения указывают относительное время. Фактическая точность таймера зависит от возможностей оборудования.

(3) lPeriod — определяет период таймера в миллисекундах. Если lPeriod равен нулю, таймер сигнализируется один раз. Если lPeriod больше нуля, таймер является периодическим. Периодический таймер автоматически активируется каждый раз, когда истекает период, пока таймер не будет отменен с помощью функции CancelWaitableTimer или сброшен с помощью SetWaitableTimer. Если lPeriod меньше нуля, функция завершается ошибкой (возврат FALSE).

(4) pfnComplRoutine — определяет указатель на необязательную процедуру завершения. Подпрограмма завершения — это определяемая приложением процедура типа PTIMERAPCROUTINE, которая вызывается при переходе таймера в сигнальное состояние. Возможно значение NULL.

(5) lpArgToComplRoutine — определяет указатель на структуру, которая передается в процедуру завершения.

(6) fResume — определяет поведение. Если этот параметр имеет значение TRUE, восстанавливает систему в режиме приостановленного энергосбережения, когда таймер в сигнальном состоянии. Если значение FALSE, то система не восстанавливается. Если система не поддерживает восстановление, вызов завершается успешно, но GetLastError возвращает ERROR_NOT_SUPPORTED.

Возвращаемое значение.

Если функция завершилась успешно, она возвращает TRUE, в противном случае — FALSE.