Using timer queues
Creates a timer timer. This timer expires at the specified time, then after each defined period. When the timer expires, the callback function is called.
The following example creates a timer procedure that will execute a thread from the timer queue after a 10 second delay. First, the code uses the CreateEvent function to create an event object that is signaled when the timer queue thread completes. This then creates a timer queue and a timer queue timer using CreateTimerQueue and CreateTimerQueueTimer functions, respectively. The code uses the WaitForSingleObject function to determine when the timer procedure has completed. Finally, the code calls DeleteTimerQueue to clear it.
For more information on the timer procedure, see WaitOrTimerCallback .
Sample code from 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; }
This is another example code from MSDN
This is another example from 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); }
Resource: