c++ - SetTimer(带回调函数)是否通过启动一个新线程来工作?

标签 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);

问题:

  • 这个方法也会阻塞吗?

  • 它会解决 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.

参见 MSDN - SetTimer function

关于c++ - SetTimer(带回调函数)是否通过启动一个新线程来工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45503465/

相关文章:

c++ - STL 容器的 Const 锁包装器

linux - 如何在 Windows 上编译 Linux 内核代码?

windows - 当存在名为 nul 的文件时,nul 如何工作

java - ThreadMXBean.getThreadCpuTime() 是否包括在所有状态下花费的时间,或仅包括 RUNNABLE?

c++ - 如何更改窗体上所有控件的标题? [C++ 生成器]

c++ - 索引到信号量数组

c++ - QSettings:是否可以禁用组?

java - Java 中循环技巧的 Helloworld 示例

java - 如何正确关闭 javafx Alerts/fileChooser 等

c++ - 将帧保存到磁盘时防止丢帧