Объекты таймера ожидания
объект таймера ожидания — это объект синхронизации, состояние которого устанавливается для сигнала при поступлении указанного времени выполнения. Существует два типа таймеров ожидания, которые можно создать: сброс вручную и синхронизация. Таймер любого типа также может быть периодическим таймером.
Объект | Описание |
---|---|
Таймер ручного сброса | Таймер, состояние которого остается сигналом до SetWaitableTimer, чтобы установить новое время выполнения. |
таймер синхронизации | Таймер, состояние которого остается сигналом, пока поток не завершит операцию ожидания в объекте таймера. |
периодический таймер | Таймер, который повторно активируется каждый раз, когда истекает указанный период, до сброса или отмены таймера. Периодический таймер — это либо периодический таймер сброса вручную, либо периодический таймер синхронизации. |
Заметка
При сигнале таймера обработчик должен выполняться для обработки связанных инструкций. Периодические таймеры с высокой частотой постоянно заняты процессором, что предотвращает сохранение системы в более низком состоянии питания на любой значимый период времени. Это может негативно повлиять на срок работы переносимого компьютера и сценарии, зависящие от эффективного управления питанием, таких как крупные центры обработки данных. Для повышения энергоэффективности рекомендуется использовать уведомления на основе событий вместо уведомлений на основе времени в приложении. Если таймер необходим, используйте таймер, который сигнализирует один раз, а не периодический таймер, или задайте интервал значению больше одной секунды.
Поток использует функци ю CreateWaitableTimer или CreateWaitableTimerEx для создания объекта таймера. Создание потока указывает, является ли таймер вручную сбросом таймера или таймером синхронизации. Создающий поток может указать имя объекта таймера. Потоки в других процессах могут открывать дескриптор существующего таймера, указав его имя в вызове функции OpenWaitableTimer. Любой поток с дескриптором для объекта таймера может использовать одну из функций ожидания ожидания, чтобы ждать, пока состояние таймера будет задано для сигнала.
- Поток вызывает функцию SetWaitableTimer для активации таймера. Обратите внимание на использование следующих параметров для SetWaitableTimer:
- Используйте параметр lpDueTime, чтобы указать время, в течение которого таймер должен быть задан в сигнальном состоянии. Если таймер сброса вручную установлен в сигнальном состоянии, он остается в этом состоянии до тех пор, пока SetWaitableTimer устанавливает новое время выполнения. Если таймер синхронизации установлен в сигнальном состоянии, он остается в этом состоянии, пока поток не завершит операцию ожидания в объекте таймера.
- Используйте параметр lPeriod функции setWaitableTimer setWaitableTimer, чтобы указать период таймера. Если период не равен нулю, таймер является периодическим таймером; он повторно активируется каждый раз, когда срок действия периода истекает, пока таймер не будет сброшен или отменен. Если период равен нулю, таймер не является периодическим таймером; он сигнализируется один раз, а затем деактивируется.
Поток может использовать функцию CancelWaitableTimer для установки таймера в неактивное состояние. Чтобы сбросить таймер, вызовите SetWaitableTimer. Завершив работу с объектом таймера, вызовите CloseHandle, чтобы закрыть дескриптор к объекту таймера.
Поведение ожидающего таймера можно свести к следующему:
- Если таймер установлен, он отменяется, если он уже активен, состояние таймера не назначено, а таймер помещается в очередь таймера ядра.
- Когда срок действия таймера истекает, таймер устанавливается в сигнальное состояние. Если таймер имеет подпрограмму завершения, он помещается в поток, задающий таймер. Подпрограмма завершения остается в очереди вызова асинхронной процедуры (APC) потока, пока поток не введет оповещенное состояние ожидания. В то время APC отправляется и вызывается подпрограмма завершения. Если таймер периодически, он помещается обратно в очередь таймера ядра.
- Если таймер отменен, он удаляется из очереди таймера ядра, если оно ожидалось. Если таймер истек и по-прежнему находится в очереди APC в поток, задающий таймер, APC удаляется из очереди APC потока. Сигнальное состояние таймера не затрагивается.
Связанные разделы