使用者感覺到軟體的好用,就是可以定時地做一些工作,而不需要人蔘與進去。比如每天定時地升級病毒庫,定時地下載電影,定時地更新遊戲裡的人物。要想實現這些功能,就可以使用定時器的API函數CreateWaitableTimer和SetWaitableTimer來實現了,這對API函數建立的時鐘是比較精確的,可以達到100倍的10億分之一秒。
函數CreateWaitableTimer和SetWaitableTimer聲明如下:
WINBASEAPI
__out
HANDLE
WINAPI
CreateWaitableTimerA(
__in_opt LPSECURITY_ATTRIBUTES lpTimerAttributes,
__in BOOL bManualReset,
__in_opt LPCSTR lpTimerName
);
WINBASEAPI
__out
HANDLE
WINAPI
CreateWaitableTimerW(
__in_opt LPSECURITY_ATTRIBUTES lpTimerAttributes,
__in BOOL bManualReset,
__in_opt LPCWSTR lpTimerName
);
#ifdef UNICODE
#define CreateWaitableTimer CreateWaitableTimerW
#else
#define CreateWaitableTimer CreateWaitableTimerA
#endif // !UNICODE
f M a n u a l R e s e t參數用於指明人工重設的定時器或自動重設的定時器。
當發出人工重設的定時器訊號通知時,等待該定時器的所有線程均變為可調度線程。當發出自
動重設的定時器訊號通知時,只有一個等待的線程變為可調度線程。
WINBASEAPI
BOOL
WINAPI
SetWaitableTimer(
__in HANDLE hTimer,
__in const LARGE_INTEGER *lpDueTime,
__in LONG lPeriod,
__in_opt PTIMERAPCROUTINE pfnCompletionRoutine,
__in_opt LPVOID lpArgToCompletionRoutine,
__in BOOL fResume
);
lpTimerAttributes是設定定時器的屬性。
bManualReset是是否手動複位。
lpTimerName是定時器的名稱。
hTimer是定時器的控制代碼。
lpDueTime是設定定時器時間間隔,當設定為正值是絕對時間;當設定為負數是相對時間。
lPeriod是周期。
pfnCompletionRoutine是設定回呼函數。
lpArgToCompletionRoutine是傳送給回呼函數的參數。
fResume是設定系統是否自動回復。
調用函數的例子如下:
#001 //建立定時器
#002
#003 int CreateTestTimer(void)
#004 {
#005 HANDLE hTimer = NULL;
#006 LARGE_INTEGER liDueTime;
#007
#008 //設定相對時間為10秒。
#009 liDueTime.QuadPart = -100000000;
#010
#011 //建立定時器。
#012 hTimer = CreateWaitableTimer(NULL, TRUE, _T("TestWaitableTimer"));
#013 if (!hTimer)
#014 {
#015 return 1;
#016 }
#017
#018 OutputDebugString(_T("10秒定時器\r\n"));
#019
#020 // 設定10秒鐘。
#021 if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0))
#022 {
#023 //
#024 CloseHandle(hTimer);
#025 return 2;
#026 }
#027
#028 //等定時器有訊號。
#029 if (WaitForSingleObject(hTimer, INFINITE) != WAIT_OBJECT_0)
#030 {
#031 OutputDebugString(_T("10秒定時器出錯了\r\n"));
#032 //
#033 CloseHandle(hTimer);
#034 return 3;
#035 }
#036 else
#037 {
#038 //10秒鐘到達。
#039 OutputDebugString(_T("10秒定時器到了\r\n"));
#040 }
#041
#042 //
#043 CloseHandle(hTimer);
#044 return 0;
#045 }