實現(xiàn)定時任務(wù)無非就是想在未來的某一時刻執(zhí)行一個任務(wù),最先想到的就是WM_TIMER消息。
方法1:WM_TIMER消息無論是否是窗口函數(shù)都可以使用它
啟動:SetTimer(HWND hWnd,UINT uID,UINT uElapse,TIMERPROC lpTimerFunc);停止:KillTimer(UINT uID);
在MFC中封裝了上面的函數(shù)將HWND hWnd參數(shù)去掉即可。
有窗口將lpTimerFunc函數(shù)指針置為空否則寫一個回調(diào)函數(shù)傳進去即可,當(dāng)經(jīng)過了uElapse時就執(zhí)行此回調(diào)函數(shù)。
WM_TIMER權(quán)限低可能被系統(tǒng)丟掉不執(zhí)行,重復(fù)判斷浪費資源。
方法2:使用內(nèi)核對象創(chuàng)建等待定時器
HANDLE CreateWaitableTimer( LPSECURITY_ATTRIBUTES lpTimerAttributes, //安全屬性一般為默認空 BOOL bManualReset, //是否手動重置 LPCTSTR lpTimerName //定生器的名稱默認為空);
設(shè)置等待定時器等待時間BOOL SetWaitableTimer( HANDLE hTimer, //上面的函數(shù)返回的參數(shù) const LARGE_INTEGER* pDueTime, //等待的時間 LONG lPeriod, //間隔的時間 PTIMERAPCROUTINE pfnCompletionRoutine, //APC回調(diào)函數(shù) LPVOID lpArgToCompletionRoutine, //傳進APC回調(diào)函數(shù)的參數(shù) BOOL fResume //是否恢復(fù)系統(tǒng)的節(jié)電模式); DWORD dwRst = WaitForMultipleObjects(1,hTimer,F(xiàn)ALSE,INFINITE);
創(chuàng)建一個線程然后執(zhí)行上面的函數(shù)等待定時器被激活然后執(zhí)行相應(yīng)的任務(wù)。上面只是給了一個想法具體的實現(xiàn)必須清楚多線程編程等知識。此方法作為本人程序中的方法推薦使用。方法3:使用系統(tǒng)的定時任務(wù)或者其他通過WinExec調(diào)用控制臺的命令對實現(xiàn)起來感覺有點亂,而且容易被操作員破壞,例如他禁用了定時任務(wù)的服務(wù)等等。
深圳北大青鳥