Bas*_*asj 2 c++ windows winapi multithreading timer
使用SetTimer这种方式时:
SetTimer(hWnd, IDT_TIMER_LONGPROCESSING, 2000, (TIMERPROC) NULL);
DoSomethingElse();
Run Code Online (Sandbox Code Playgroud)
执行立即继续(即它是非阻塞的并DoSomethingElse()立即执行),但是当此消息到达时
case WM_TIMER:
if (wParam == IDT_TIMER_LONGPROCESSING)
DoAOneSecondLongJob();
Run Code Online (Sandbox Code Playgroud)
然后它在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);
Run Code Online (Sandbox Code Playgroud)
题:
要么
不,它不使用单独的线程,所以是的,它会阻塞.它只是一个利用WM_TIMER内部的便利功能.你应该从它仍然涉及hwnd其工作的事实中得到一个暗示.
如果你想在不同的线程上运行某些东西,你需要启动一个不同的线程.
MSDN说:
指定TimerProc回调函数时,默认窗口过程在处理WM_TIMER时调用回调函数.因此,即使使用TimerProc而不是处理WM_TIMER,也需要在调用线程中调度消息.
| 归档时间: |
|
| 查看次数: |
1494 次 |
| 最近记录: |