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