Таймеры ожидания

Таймеры ожидания

Windows NT поддерживает таймеры ожидания (waitable timers), являющихся одним из типов объектов ядра, осуществляющих ожидание.

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

Таймер ожидания может быть либо синхронизирующим (synchronization timer), либо сбрасываемым вручную уведомляющим (manual-reset notification timer) таймером. Синхронизирующий таймер связывается с функцией косвенного вызова, аналогичной процедуре завершения расширенного ввода/вывода, тогда как для синхронизации по сбрасываемому вручную уведомляющему таймеру используется функция ожидания.

Для начала потребуется создать дескриптор таймера, используя для этого функцию CreateWaitableTimer. 

HANDLE CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCTSTR lpTimerName);

Второй параметр, bManualReset, определяет, таймер какого типа должен быть создан — синхронизирующий или уведомляющий. В программе 14.3 используется синхронизирующий таймер, но, изменив комментарии и настройку параметра, вы легко превратите его в уведомляющий таймер. Заметьте, что существует также функция OpenWaitableTimer, которая может использовать необязательное имя, предоставляемое третьим аргументом.

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

BOOL SetWaitableTimer(HANDLE hTimer, const LARGE_INTEGER *pDueTime, LONG IPeriod, PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, BOOL fResume); 

hTimer — действительный дескриптор таймера, созданного с использованием функции CreateWaitableTimer.

Второй параметр, на который указывает указатель pDueTime, может принимать либо положительные значения, соответствующие абсолютному времени, либо отрицательные, соответствующие относительному времени, причем фактические значения выражаются в единицах времени длительностью 100 наносекунд, а их формат описывается структурой FILETIME. Переменные типа FILETIME были введены в главе 3 и уже использовались нами в главе 6 в программе timep (программа 6.2).

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

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

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

Последний параметр, fResume, связан с режимами энергосбережения. Для получения более подробной информации по этому вопросу обратитесь к справочной документации.

Функция CancelWaitableTimer используется для отмены действия вызванной перед этим функции SetWaitableTimer, но при этом не изменяет сигнальное состояние таймера. Чтобы это сделать, необходимо в очередной раз вызвать функцию SetWaitableTimer.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Грозовые ожидания

Из книги Журнал `Компьютерра` N735 автора Журнал «Компьютерра»

Грозовые ожидания Автор: Ваннах МихаилПризовем на помощь архетип… Сидишь себе в уютной пещере после хорошей порции мяса шерстистого носорога, щуришься в багрянец костра и ведешь речь о том угрожающем, что прячется в ночном лесу - хищниках, вампирах, леших… Тебе внимают -


18.2.1. Режим ожидания

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

18.2.1. Режим ожидания Процесс, сопровождающийся запросом на невыполнение в течение определенного количества времени, называется отложенным (или "спящим"). Для режима ожидания доступны четыре функции; каждая из них измеряет время в различных единицах. Они также ведут себя и


18.2.2. Интервальные таймеры

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

18.2.2. Интервальные таймеры Интервальные таймеры, будучи активизированными, непрерывно передают сигналы в процесс на систематической основе. Точное значение термина систематический зависит от используемого интервального таймера. С каждым процессом ассоциированы три


23.2.5. Таймеры в Glib

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

23.2.5. Таймеры в Glib Библиотека Glib позволяет использовать таймеры в наших программах.Для этого нужно:? подключить заголовочный файл gtimer.h;? создать таймер функцией GTimer *g_timer_new();? запустить таймер функцией g_timer_start(GTimer *timer);? узнать время, отсчитанное таймером — g_timer_elapsed();? при


Функции ожидания

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Функции ожидания Ожидание выполнения условия для ждущей блокировки может выполняться в двух вариантах: простое ожидание и ожидание с установкой тайм-аута.int pthread_sleepon_wait(const volatile void* addr);int pthread_sleepon_timedwait(const volatile void* addr, uint64_t nsec);При вызове функций ожидания необходимо указать


Часы, таймеры и периодические уведомления

Из книги Linux программирование в примерах автора Роббинс Арнольд

Часы, таймеры и периодические уведомления В этой главе вы изучите системные часы, таймеры, и как заставить таймеры посылать вам сообщения. В ней также много практических советов и изобилие примеров


Часы и таймеры

Из книги Разработка ядра Linux автора Лав Роберт

Часы и таймеры Пришло время рассмотреть все, что относится ко времени в QNX/Neutrino. Мы увидим, как и почему мы должны использовать таймеры, а также рассмотрим теоретические положения, которые этому сопутствуют. Далее мы обсудим способы опроса и настройки часов реального


Таймеры, посылающие сигналы

Из книги автора

Таймеры, посылающие сигналы На настоящий момент мы уже рассмотрели практически все, что относится к таймерам, за исключением одного небольшого момента. Мы обеспечивали отправку импульса, но у нас также есть возможность посылать POSIX-сигналы. Давайте посмотрим, как это


Таймеры, создающие потоки

Из книги автора

Таймеры, создающие потоки Если вы хотите по каждому срабатыванию таймера создавать новый поток, то вы можете это сделать с помощью struct sigevent и всех остальных таймерных штук, которые мы только что обсудили:struct sigevent event;SIGEV_THREAD_INIT(&event, maintenance_func, NULL);Однако, пользоваться этим


Таймеры

Из книги автора

Таймеры KillTimer Функция KillTimer разрушает указанный таймер. BOOL KillTimer ( HWND hWnd , // дескриптор окна, установившего таймер UINT uIDEvent // идентификатор таймера ); Параметры hWnd - идентифицирует окно, связанное с указанным таймером. Значение должно совпадать со значением параметра hWnd ,


Мультимедиа таймеры

Из книги автора

Мультимедиа таймеры TimeProc Функция TimeProc является функцией обратного вызова, которая вызывается один раз по завершению одиночного события таймера или периодически по завершению периодических событий. void CALLBACK TimeProc ( UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2); TimeProc является


Глава 10 Таймеры и управление временем

Из книги автора

Глава 10 Таймеры и управление временем Отслеживание хода времени очень важно для ядра. Большое количество функций, которые выполняет ядро, управляются временем (time driven), в отличие от тех функций, которые выполняются по событиям[53] (event driven). Некоторые из этих функций


Аппаратные часы и таймеры

Из книги автора

Аппаратные часы и таймеры Различные аппаратные платформы предоставляют два аппаратных устройства, которые помогают вести учет времени, — это системный таймер, о котором уже было рассказано, и часы реального времени. Реализация и поведение этих устройств могут быть


Таймеры

Из книги автора

Таймеры Таймеры (timers), или, как их еще иногда называют, динамические таймеры, или таймеры ядра, необходимы для управления ходом времени в ядре. Коду ядра часто необходимо откладывать выполнение некоторых функций на более позднее время. Здесь намеренно выбрано не очень