Использование очередей таймера
Создает таймер очереди таймера. Этот таймер истекает в указанный срок
время, то после каждого указанного периода. Когда таймер истекает,
вызывается функция обратного вызова.
В следующем примере создается процедура таймера, которая будет выполняться
поток из очереди таймера после 10-секундной задержки. Во-первых,
код использует функцию CreateEvent
для создания объекта события
это сигнализируется, когда поток очереди таймера завершается. Затем это
создает очередь таймера и таймер очереди таймера, используя
CreateTimerQueue
и функции CreateTimerQueueTimer,
соответственно. Код использует функцию WaitForSingleObject
для
определить, когда процедура таймера завершена. Наконец, код
звонит DeleteTimerQueue
на уборку.
Для получения дополнительной информации о процедуре таймера см. WaitOrTimerCallback
.
Пример кода из MSDN:
#include <windows.h>
#include <stdio.h>
HANDLE gDoneEvent;
VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
if (lpParam == NULL)
{
printf("TimerRoutine lpParam is NULL\n");
}
else
{
// lpParam points to the argument; in this case it is an int
printf("Timer routine called. Parameter is %d.\n",
*(int*)lpParam);
if(TimerOrWaitFired)
{
printf("The wait timed out.\n");
}
else
{
printf("The wait event was signaled.\n");
}
}
SetEvent(gDoneEvent);
}
int main()
{
HANDLE hTimer = NULL;
HANDLE hTimerQueue = NULL;
int arg = 123;
// Use an event object to track the TimerRoutine execution
gDoneEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (NULL == gDoneEvent)
{
printf("CreateEvent failed (%d)\n", GetLastError());
return 1;
}
// Create the timer queue.
hTimerQueue = CreateTimerQueue();
if (NULL == hTimerQueue)
{
printf("CreateTimerQueue failed (%d)\n", GetLastError());
return 2;
}
// Set a timer to call the timer routine in 10 seconds.
if (!CreateTimerQueueTimer( &hTimer, hTimerQueue,
(WAITORTIMERCALLBACK)TimerRoutine, &arg , 10000, 0, 0))
{
printf("CreateTimerQueueTimer failed (%d)\n", GetLastError());
return 3;
}
// TODO: Do other useful work here
printf("Call timer routine in 10 seconds...\n");
// Wait for the timer-queue thread to complete using an event
// object. The thread will signal the event at that time.
if (WaitForSingleObject(gDoneEvent, INFINITE) != WAIT_OBJECT_0)
printf("WaitForSingleObject failed (%d)\n", GetLastError());
CloseHandle(gDoneEvent);
// Delete all timers in the timer queue.
if (!DeleteTimerQueue(hTimerQueue))
printf("DeleteTimerQueue failed (%d)\n", GetLastError());
return 0;
}
Это еще один пример кода из MSDN
Это еще один пример из Codeproject
#include <windows.h>
HANDLE hTimer = NULL;
unsigned long _stdcall Timer(void*)
{
int nCount = 0;
while(nCount < 10)
{
WaitForSingleObject(hTimer, 5000);
cout << "5 s\n";
nCount++;
}
cout << "50 secs\n";
return 0;
}
void main()
{
DWORD tid;
hTimer = CreateEvent(NULL, FALSE, FALSE, NULL);
CreateThread(NULL, 0, Timer, NULL, 0, &tid);
int t;
while(cin >> t)
{
if(0==t)
SetEvent(hTimer);
}
CloseHandle(hTimer);
}
Ресурс: