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

Bas*_*asj 2 c++ windows winapi multithreading timer

使用SetTimer这种方式时:

SetTimer(hWnd, IDT_TIMER_LONGPROCESSING, 2000, (TIMERPROC) NULL);
DoSomethingElse();
Run Code Online (Sandbox Code Playgroud)

执行立即继续(即它是非阻塞的DoSomethingElse()立即执行),但是当此消息到达时

case WM_TIMER:
    if (wParam == IDT_TIMER_LONGPROCESSING)
         DoAOneSecondLongJob();
Run Code Online (Sandbox Code Playgroud)

然后它在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);
Run Code Online (Sandbox Code Playgroud)

题:

  • 这种方法也会阻塞吗?

要么

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

Mik*_*kis 6

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

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

MSDN说:

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

请参阅MSDN - SetTimer函数

  • `SetTimer()`是一个基于消息的计时器.如果你想要一个基于线程的计时器,请使用[`timeSetEvent()`](https://msdn.microsoft.com/en-us/library/dd757634.aspx)或[`CreateTimerQueueTimer()`](https:/ /msdn.microsoft.com/en-us/library/ms682485.aspx)而不是. (2认同)