之前学习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核心编程