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