摘抄自:http://bbs.csdn.net/topics/300033602
HANDLE CreateWaitableTimer(
LPSECURITY_ATTRIBUTES lpTimerAttributes, //安全描述符,可以为NULL BOOL bManualReset, //是否为手动定时器,如果是手动的,需要调用SetWaitableTimer才能将定时器变成信号的,如果是自动的,则调用WaitForsingleObject即可实现定时器信号的重置 LPCTSTR lpTimerName //定时器名称,这对于进程间的定时器来说是有用的。 ); SetWaitableTimer有两种用法, 第一种是设置定义器信号态时间,对于自动重置等待定时器,一时变成有信号的,那么WaitforsingleObject函数就会返回,并且,定时器变成非信号的,这时需要设置这个函数中的参数二,参数三,四,五被忽略。 第二种是设置定义器的周期响应时间,这种用法与普通定时器类似,不过要提供APC回调函数。这时需要设置这个函数中的参数三,四,五,参数二被忽略 第一方法需要将WaitForSingleObject放在一个循环中,每次调用SetWaitableTimer来重置信号: HANDLE hTimer = NULL; LARGE_INTEGER liDueTime; liDueTime.QuadPart=-100000000; // Create a waitable timer. hTimer = CreateWaitableTimer(NULL, TRUE, _T("WaitableTimer")); //设置成手动重置定时器 if (!hTimer) { printf("CreateWaitableTimer failed (%d)\n", GetLastError()); return 1; } printf("Waiting for 10 seconds...\n"); // Set a timer to wait for 10 seconds. if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0)) { printf("SetWaitableTimer failed (%d)\n", GetLastError()); return 2; } // Wait for the timer. while(true) { if (WaitForSingleObject(hTimer, INFINITE) != WAIT_OBJECT_0) { printf("WaitForSingleObject failed (%d)\n", GetLastError()); } else { printf("Timer was signaled.\n"); SetWaitableTimer(hTimer,&liDueTime,0,NULL,NULL,0); } } 这样一来,第10秒钟会显示出“Timer was signaled.” 第二个方法 #define _WIN32_WINNT 0x0500 #include <windows.h> #include <stdio.h> #define _SECOND 10000000 typedef struct _MYDATA { TCHAR *szText; DWORD dwValue; } MYDATA; VOID CALLBACK TimerAPCProc( LPVOID lpArg, // Data value DWORD dwTimerLowValue, // Timer low value DWORD dwTimerHighValue ) // Timer high value { MYDATA *pMyData = (MYDATA *)lpArg; printf( "Message: %s\nValue: %d\n\n", pMyData->szText, pMyData->dwValue ); MessageBeep(0); } void main( void ) { HANDLE hTimer; BOOL bSuccess; __int64 qwDueTime; LARGE_INTEGER liDueTime; MYDATA MyData; TCHAR szError[255]; MyData.szText = "This is my data."; MyData.dwValue = 100; if ( hTimer = CreateWaitableTimer( NULL, // Default security attributes FALSE, // Create auto-reset timer "MyTimer" ) ) // Name of waitable timer { __try { bSuccess = SetWaitableTimer( hTimer, // Handle to the timer object 0, 2000, // Periodic timer interval of 2 seconds TimerAPCProc, // Completion routine &MyData, // Argument to the completion routine FALSE ); // Do not restore a suspended system if ( bSuccess ) { for ( ; MyData.dwValue < 1000; MyData.dwValue += 100 ) { SleepEx( INFINITE, // Wait forever TRUE ); // Put thread in an alertable state } } else { wsprintf( szError, "SetWaitableTimer failed with Error \ %d.", GetLastError() ); MessageBox( NULL, szError, "Error", MB_ICONEXCLAMATION ); } } __finally { CloseHandle( hTimer ); } } else { wsprintf( szError, "CreateWaitableTimer failed with Error %d.", GetLastError() ); MessageBox( NULL, szError, "Error", MB_ICONEXCLAMATION ); } }