基本函数介绍:
创建定时器
- HANDLE WINAPI CreateWaitableTimer(
- __in_opt LPSECURITY_ATTRIBUTES psa,
- __in BOOL bManualReset,
- __in_opt LPCTSTR lpTimerName
- );
参数1:此参数在Vista下,如果跨Session通信的话注意权限和完整性问题
参数2:创建的是手动重置的等待定时器还是自动重置的等待定时器
参数3:内核对象的名称,类似如Gloable/AA 或者AA的形式
刚创建的时候,等待定时器的状态总是没有触发的状态,需要调用 SetWaitableTimer函数触发
获得一个已经创建的等待定时器的句柄根据名称来访问
- HANDLE WINAPI OpenWaitableTimer(
- __in DWORD dwDesiredAccess,
- __in BOOL bInheritHandle,
- __in LPCTSTR lpTimerName
- );
设置定时器
- BOOL WINAPI SetWaitableTimer(
- __in HANDLE hTimer,
- __in const LARGE_INTEGER *pDueTime,
- __in LONG lPeriod,
- __in_opt PTIMERAPCROUTINE pfnCompletionRoutine,
- __in_opt LPVOID lpArgToCompletionRoutine,
- __in BOOL fResume
- );
参数1:需要触犯的等待定时器的句柄
参数2:
参数3:2,3参数一起使用,DueTime 表示的是第一次触发的时间,而period表示的是第一次触发之后,定时器调度的频度(即多久之后再次触发)
参数4:定时器被触发的时候的APC函数地址,此APC例程只有当Set函数的调用线程正处于 alterable state的时候,此函数才会被set函数的同一个线程所调用
参数5:传送给参数4的函数的参数
Note:参数2的类型是 LARGE_INTEGER 不能直接的接受SYSTEMTIME结构类型,尽管他们的结构一致,但是LARGE_INTEGER是64位对齐,而SYSTEMTIME是32位对齐
可以做如下的转换:
FILETIME ftFileTime;
LARGE_INTEGER liTime;
liTime.LowPart = ftFileTime.dwLowDateTime;
liTime.QuardPart = ftFileTime.dwHighDateTime;
另外次函数传入的时间默认的是UTC时间
第一次触发的时间可以是个绝对时间也可以是个相对时间,只需pDueTime传入负值
例如如下代码:
- HANDLE hTimer =INVALID_HANDLE_VALUE;
- LARGE_INTEGER liDueTime = {0};
- hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
- if(hTimer == INVALID_HANDLE_VALUE)
- {
- return -1;
- }
- const int iTimerUnitPerSecond = 1000000;
- liDueTime.LowPart = -(5*iTimerUnitPerSecond);
- SetWaitableTimer(hTimer, liDueTime, lPeriod, NULL, NULL, FALSE);
取消等待定时器
- BOOL WINAPI CancelWaitableTimer(
- __in HANDLE hTimer
- );
Note:关于Timer的APC例程,函数必须保证 APC Route函数必须在下次Timer被再次触发之前结束,
否则APC函数加入队列的速度超过了处理他们的速度,APC例程将会一直被执行
-
- VOID APIENTRY TimerFunction(PVOID pvArg, DWORD dwLowPart, DWORD dwHighPart)
- {
- FILETIME ftUTC, ftLocal;
- SYSTEMTIME st;
- TCHAR tszBuf[MAX_PATH]= {0x00};
-
- ftUTC.dwLowDateTime = dwLowPart;
- ftUTC.dwHighDateTime = dwHighPart;
-
- FileTimeToLocalFileTime(&ftUTC, &ftLocal);
-
- FileTimeToSystemTime(&ftLocal, &st);
- GetDateFormat(LOCALE_USER_DEFAULT, 0,&st, NULL,
- _tcschr(tszBuf, TEXT('/0')),
- (int)(_countof(tszBuf) - _tcslen(tszBuf)));
-
- _tprintf(TEXT("Timer Went OK.../n"));
- Sleep(2000);
- }
-
-
- VOID TimerTest()
- {
- HANDLE hTimer = INVALID_HANDLE_VALUE;
-
- hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
- if(hTimer == INVALID_HANDLE_VALUE)
- {
- return ;
- }
-
- LARGE_INTEGER liTime = {0};
- SetWaitableTimer(hTimer, &liTime, 5000,
- TimerFunction, NULL, FALSE);
-
- SleepEx(INFINITE, TRUE);
- CloseHandle(hTimer);
-
- }
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- TimerTest();
- return 0;
- }
-