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