ОС Windows: таймеры ожидания и понятие APC.

Эти таймеры используются для выполнения определённых действий в заданное время или через определённый интервал времени.
Таймер ожидания является таким же объектом синхронизации как, например семафор, т.е. его можно дождаться с помощью ф-ций 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);

Комментариев нет:

Отправить комментарий