Объекты таймера, доступные для ожидания

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

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

 

Примечание

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

 

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

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

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

Поведение таймера ожидания можно обобщить следующим образом:

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

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

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