gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:47:16 26 4
gpt4 key购买 nike

使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com