Поделиться через


Объекты таймера ожидания

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

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

 

Заметка

При сигнале таймера обработчик должен выполняться для обработки связанных инструкций. Периодические таймеры с высокой частотой постоянно заняты процессором, что предотвращает сохранение системы в более низком состоянии питания на любой значимый период времени. Это может негативно повлиять на срок работы переносимого компьютера и сценарии, зависящие от эффективного управления питанием, таких как крупные центры обработки данных. Для повышения энергоэффективности рекомендуется использовать уведомления на основе событий вместо уведомлений на основе времени в приложении. Если таймер необходим, используйте таймер, который сигнализирует один раз, а не периодический таймер, или задайте интервал значению больше одной секунды.

 

Поток использует функци ю CreateWaitableTimer или CreateWaitableTimerEx для создания объекта таймера. Создание потока указывает, является ли таймер вручную сбросом таймера или таймером синхронизации. Создающий поток может указать имя объекта таймера. Потоки в других процессах могут открывать дескриптор существующего таймера, указав его имя в вызове функции OpenWaitableTimer. Любой поток с дескриптором для объекта таймера может использовать одну из функций ожидания ожидания, чтобы ждать, пока состояние таймера будет задано для сигнала.

  • Поток вызывает функцию SetWaitableTimer для активации таймера. Обратите внимание на использование следующих параметров для SetWaitableTimer:
  • Используйте параметр lpDueTime, чтобы указать время, в течение которого таймер должен быть задан в сигнальном состоянии. Если таймер сброса вручную установлен в сигнальном состоянии, он остается в этом состоянии до тех пор, пока SetWaitableTimer устанавливает новое время выполнения. Если таймер синхронизации установлен в сигнальном состоянии, он остается в этом состоянии, пока поток не завершит операцию ожидания в объекте таймера.
  • Используйте параметр lPeriod функции setWaitableTimer setWaitableTimer, чтобы указать период таймера. Если период не равен нулю, таймер является периодическим таймером; он повторно активируется каждый раз, когда срок действия периода истекает, пока таймер не будет сброшен или отменен. Если период равен нулю, таймер не является периодическим таймером; он сигнализируется один раз, а затем деактивируется.

Поток может использовать функцию CancelWaitableTimer для установки таймера в неактивное состояние. Чтобы сбросить таймер, вызовите SetWaitableTimer. Завершив работу с объектом таймера, вызовите CloseHandle, чтобы закрыть дескриптор к объекту таймера.

Поведение ожидающего таймера можно свести к следующему:

  • Если таймер установлен, он отменяется, если он уже активен, состояние таймера не назначено, а таймер помещается в очередь таймера ядра.
  • Когда срок действия таймера истекает, таймер устанавливается в сигнальное состояние. Если таймер имеет подпрограмму завершения, он помещается в поток, задающий таймер. Подпрограмма завершения остается в очереди вызова асинхронной процедуры (APC) потока, пока поток не введет оповещенное состояние ожидания. В то время APC отправляется и вызывается подпрограмма завершения. Если таймер периодически, он помещается обратно в очередь таймера ядра.
  • Если таймер отменен, он удаляется из очереди таймера ядра, если оно ожидалось. Если таймер истек и по-прежнему находится в очереди APC в поток, задающий таймер, APC удаляется из очереди APC потока. Сигнальное состояние таймера не затрагивается.

асинхронные вызовы процедур

использование объектов таймера ожидания