Рассмотрим параметры этой функции. Первый параметр
возвращает хендл таймера, который можно использовать для вызова функций
изменения таймера или его удаления (о них позже). Второй параметр – хендл
очереди, созданной функцией CreateTimerQueue. В качестве него можно указать
нулевое значение. В этом случае по умолчанию таймер будет добавлен к объекту
"очередь таймеров". Третий параметр – адрес функции, которая будет
вызвана при переходе таймера в сигнальное состояние. Вот ее прототип:
VOID CALLBACK WaitOrTimerCallback(
PVOID lpParameter, // произвольный параметр
BOOLEAN TimerOrWaitFired //
причина вызова
);
|
Произвольный параметр для нее указывается в функции
CreateTimerQueueTimer четвертым параметром. Параметр TimerOrWaitFired для
таймеров всегда равен TRUE.
Пятый параметр определяет, сколько времени в
миллисекундах пройдет до первого вызова функции WaitOrTimerCallback. Если
указать 0, то эта функция будет вызвана практически сразу (примерно так же
быстро, как и в случае QueueUserWorkItem).
Шестой параметр задает период вызова пользовательской
функции. В качестве этого параметра можно указать нулевое значение, тогда
функция WaitOrTimerCallback будет вызвана только один раз.
В качестве флагов функции CreateTimerQueueTimer можно
указывать все флаги из таблицы 2 и два новых:
Константа
|
Значение
|
Описание
|
WT_EXECUTEINTIMERTHREAD
|
0x20
|
Пользовательская функция
вызывается в потоке таймера
|
WT_EXECUTEONLYONCE
|
8
|
Пользовательская функция
вызывается только один раз
|
Таблица 6. Флаги функции CreateTimerQueueTimer.
Если ваша функция WaitOrTimerCallback очень быстро
отрабатывает, а количество запросов невелико – лучше всего указать флаг
WT_EXECUTEINTIMERTHREAD. В этой ситуации функция будет вызвана в потоке, ожидающем таймера. Будьте осторожны – длительная блокировка пользовательской
функции приведет к тому, что ожидающий поток не сможет обрабатывать приходящие
запросы.
При указании флага WT_EXECUTEONLYONCE таймер будет
установлен в сигнальное состояние только один раз.
Если вам больше не нужен таймер, его можно удалить из
очереди с помощью функции DeleteTimerQueueTimer.