之前學習win32 platform sdk編程的時候, 有學到一個計時器的東西, 那個挺簡單的, 就是調用SetTimer創建一個基于某個窗口回調的計時器, 既間隔時間使窗口收到WM_TIMER消息, 或間隔時間, 調用我們自己定義的一個回調函數.
創建可等待計時器內核對象, 可以實現類似功能, 現在, 下邊給出如何使用可等待計時器內核對象
1.CreateWatchDogTimer
HANDLE CreateWatchDogTimer(
LPCWSTR pszWatchDogName,
DWORD dwPeriod,
DWORD dwWait,
DWORD dwDfltAction,
DWORD dwParam,
DWORD dwFlags
);
2.SetWaitableTimer
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
);
CreateWatchDogTimer函數就是創建一個可等待事件內核對象
SetWaitableTimer函數就是設置內核對象的觸發時間和時間間隔
廢話不多說了, 這里直接上代碼
void CDialogDemoDlg::OnBtnCreateTimer()
{
SYSTEMTIME st;
st.wYear = 2012;
st.wDay = 10;
st.wDayOfWeek = 0;
st.wHour = 20;
st.wMilliseconds = 0;
st.wMinute = 16;
st.wMonth = 5;
st.wSecond = 0;
FILETIME localft;
FILETIME utc;
SystemTimeToFileTime(&st, &localft);
LocalFileTimeToFileTime(&localft, &utc);
LARGE_INTEGER liUTC;
liUTC.LowPart = utc.dwLowDateTime;
liUTC.HighPart = utc.dwHighDateTime;
m_Timer = CreateWaitableTimer(NULL, FALSE, NULL);
SetWaitableTimer(m_Timer, &liUTC, 10 * 1000, NULL, NULL, FALSE);
}
void CDialogDemoDlg::ThreadProc2(CDialogDemoDlg* pDlg)
{
while(1)
{
DWORD ret = WaitForSingleObject(pDlg->m_Timer, INFINITE);
if(WAIT_OBJECT_0 == ret)
{
AfxMessageBox("可等待事件內核對象觸發!");
}
}
}
ThreadProc2是一個線程, 當時間一到, WaitForSingleObject就會返回, 因為這里創建的是一個自動復位內核對象, 說以WaitForSingleObject返回是會自動把內核對象復位, 這里為演示, 寫了個死循環, 所以, 下一次調用WaitForSingleObject時, 如果時間未到, 線程任然會被掛起.
具體用法細節, MSDN
參考: windows核心編程