Эти
таймеры используются для выполнения определённых действий в заданное время или
через определённый интервал времени.
Таймер
ожидания является таким же объектом синхронизации как, например семафор, т.е.
его можно дождаться с помощью ф-ций WaitFor. Таймер
переходит в сигнальное состояние по достижению заданной точки во времени. Этими
таймерами следует пользоваться с большей предпочтительностью, нежели оконным
сообщением WM_TIMER.
Ждущий
таймер создается с помощью функции CreateWaitableTimer.
HANDLE CreateWaitableTimer(
LPSECURITY_ATTRIBUTES psa,
BOOL bManualReset,
LPCTSTR pTimerName); // имя таймера
HANDLE OpenWaitableTimer(
DWORD dwDesiredAccess, // описатель таймера
BOOL bInhemtHandle, //время срабатывания
LPCTSTR pTimerName);
Положительное
значение времени срабатывания даёт абсолютное время, отрицательное даёт
относительное время.
Задание
времени срабатывания таймера производится с помощью функции SetWaitableTimer.
BOOL SetWaitableTimer(
HANDLE hTimer,
const LARGE_INTEGER*pDurTime, //8-ми байтовое целое
LONG lPeriod, //период
PRIMERAPCROUTINE pfnCompletion, // измеряется в 10-3секундах
LPVOID pArgCompletion, //аргумент
APC функции
BOOL fResume); //если не равен нулю, то при
срабатывании таймера компьютер проснётся из спящего режима
Если
период срабатывания таймера в функции SetWaitableTimer равен нулю,
то таймер сработает лишь однажды.
VOID CALLBACK
TimerAPCProc(
LPVOID pArgCompletion,
DWORD dTimerLowValue, //время
DWORD dTimerLowValue); //время
Ждущие
таймеры как и события бывают с ручным сбросом и синхронизирующие. Таймеры с
ручным сбросом освобождают все ждущие их нити, синхронизирующие только одну.
Время
измеряется в ста наносекундных интервалах начиная с 1 января 1601 года.
BOOL SystemTimeToFileTime(
const SYSTEMTIME *SystemTime,
LPFILETIME pFileTime);
Структура
SystemTime содержит значения: год, месяц, день,
минута, секунда.
Структура
FILETIME – это 8-ми байтовое целое.
Для
того чтобы перевести время из текущего часового пояса в значение по Гринвичу
используется ф-ция:
BOOL LocalFileTimeToFileTime(
Const EILETIME *pLocalFileTime,
LPFILETIME pFileTime);
Ожидание
срабатывания таймера можно производить с помощью ф-ций группы WaitFor, другой способ задания APC ф-ций. Не рекомендуется делать и то и другое
одновременно, поскольку если вы ждёте таймер в тревожном состоянии с помощью
ф-ций с суффиксом Ex, то после
срабатывания таймера произойдёт выход из ф-ции ожидания, а когда выйдете из
ф-ции, то нить перестанет быть в тревожном состоянии и APC
ф-ция не вызовется.
APC (Asynchronous Procedure Call) –
асинхронный вызов процедуры.
С
помощью ждущих таймеров можно легко программировать максимальное время ожидания
поступления данных.
Существуют
спец. ф-ции отмены ожидания: BOOL CancelWaitableTimer(HANDLE hTimer);
Комментариев нет:
Отправить комментарий