SetTimer (带有回调函数)是否通过启动新线程来工作?
Does SetTimer (with callback function) work by starting a new thread?
以这种方式使用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 - 设置计时器函数
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 多线程:线程或进程.h - C++
- BOOST线程:线程还是进程
- 如何在线程线程内部制作内存?
- C++ - 多线程 - 线程之间的通信
- C++多线程:线程安全的内存分配
- 如何在 Linux 上强制 g++ 在协程切换线程时更新线程指针(对于 TLS)
- 如何确定流程的"经理"和"工作线程"线程的优先级(或为其设置调度策略)?
- 一旦另一个线程完成,就会生成一个新线程
- 是boost::线程线程安全的
- c++多线程-线程安全的代码
- 依靠额外的线程-线程安全
- Linux多线程——线程不会产生任何预期的输出
- 线程-线程创建问题
- 只在前一个线程完成时创建一个新线程
- 创建新线程时在lambda内部使用unique_ptr的线程安全性