之前學習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核心編程