之前學(xué)習(xí)win32 platform sdk編程的時(shí)候, 有學(xué)到一個(gè)計(jì)時(shí)器的東西, 那個(gè)挺簡單的, 就是調(diào)用SetTimer創(chuàng)建一個(gè)基于某個(gè)窗口回調(diào)的計(jì)時(shí)器, 既間隔時(shí)間使窗口收到WM_TIMER消息, 或間隔時(shí)間, 調(diào)用我們自己定義的一個(gè)回調(diào)函數(shù).
創(chuàng)建可等待計(jì)時(shí)器內(nèi)核對象, 可以實(shí)現(xiàn)類似功能, 現(xiàn)在, 下邊給出如何使用可等待計(jì)時(shí)器內(nèi)核對象
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函數(shù)就是創(chuàng)建一個(gè)可等待事件內(nèi)核對象
SetWaitableTimer函數(shù)就是設(shè)置內(nèi)核對象的觸發(fā)時(shí)間和時(shí)間間隔
廢話不多說了, 這里直接上代碼
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("可等待事件內(nèi)核對象觸發(fā)!");
}
}
}
ThreadProc2是一個(gè)線程, 當(dāng)時(shí)間一到, WaitForSingleObject就會返回, 因?yàn)檫@里創(chuàng)建的是一個(gè)自動復(fù)位內(nèi)核對象, 說以WaitForSingleObject返回是會自動把內(nèi)核對象復(fù)位, 這里為演示, 寫了個(gè)死循環(huán), 所以, 下一次調(diào)用WaitForSingleObject時(shí), 如果時(shí)間未到, 線程任然會被掛起.
具體用法細(xì)節(jié), MSDN
參考: windows核心編程