以这种方式使用SetTimer
:
SetTimer(hWnd, IDT_TIMER_LONGPROCESSING, 2000, (TIMERPROC) NULL);
DoSomethingElse();
立即执行(即非阻塞并立即执行DoSomethingElse()
),但此消息到达时
case WM_TIMER:
if (wParam == IDT_TIMER_LONGPROCESSING)
DoAOneSecondLongJob();
然后它在1秒长的处理期间再次阻止“窗口消息循环”,导致无响应的界面。这是SetTimer
仅发布计时器消息的正常行为。
但我看到SetTimer
也可以第二种方式使用 ,并带有回调函数:
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
DoAOneSecondLongJob();
}
// in another function
SetTimer(hwnd, IDT_TIMER_LONGPROCESSING, 2000, (TIMERPROC) MyTimerProc);
问题:
或
答案 0 :(得分:6)
不,它不使用单独的线程,所以是的,它会阻塞。它只是一个在内部使用WM_TIMER
的便利功能。你应该从它的工作中仍然涉及hwnd
的事实中得到一个暗示。
如果你想在不同的线程上运行某些东西,你需要启动一个不同的线程。
MSDN说:
当您指定 TimerProc 回调函数时,默认窗口过程会在处理 WM_TIMER 时调用回调函数。因此,即使使用 TimerProc 而不是处理 WM_TIMER ,您也需要在调用线程中发送消息。