SetTimer(具有回调函数)是否通过启动新线程工作?

时间:2017-08-04 09:44:19

标签: c++ windows multithreading winapi timer

以这种方式使用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);

问题:

  • 这种方法也会被阻止吗?

  • 它会解决1秒内无响应接口的问题吗?如果是这样,怎么办?引擎盖下是否有新的线程创建?

1 个答案:

答案 0 :(得分:6)

不,它不使用单独的线程,所以是的,它会阻塞。它只是一个在内部使用WM_TIMER的便利功能。你应该从它的工作中仍然涉及hwnd的事实中得到一个暗示。

如果你想在不同的线程上运行某些东西,你需要启动一个不同的线程。

MSDN说:

  

当您指定 TimerProc 回调函数时,默认窗口过程会在处理 WM_TIMER 时调用回调函数。因此,即使使用 TimerProc 而不是处理 WM_TIMER ,您也需要在调用线程中发送消息。

请参阅MSDN - SetTimer function