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

Does SetTimer (with callback function) work by starting a new thread?

本文关键字:新线程 线程 工作 启动 回调 函数 SetTimer 是否      更新时间:2023-10-16

以这种方式使用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 秒内界面无响应的问题吗?如果是这样,如何?引擎盖下是否涉及新的线程创建?

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

如果您希望某些内容在不同的线程上运行,则需要启动不同的线程。

MSDN 说:

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

请参阅 MSDN - 设置计时器函数