使用 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);
问题:
- 这个方法也会阻塞吗?
或
- 它会解决 unresponsive-interface-during-1-second 问题吗?如果会,如何解决?幕后是否涉及新线程的创建?
最佳答案
不,它不使用单独的线程,所以是的,它会阻塞。它只是一个在内部使用 WM_TIMER
的便利函数。您应该从它的工作中仍然涉及 hwnd
的事实中得到提示。
如果你想让某些东西在不同的线程上运行,你需要启动一个不同的线程。
MSDN 说:
When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.
关于c++ - SetTimer(带回调函数)是否通过启动一个新线程来工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45503465/