我有一个主线程和子线程。
在子线程中,我将消息发送到主线程。
在主线程中,我称之为:
while( ::WaitForSingleObject(hThread, 0) == WAIT_TIMEOUT )
{
MSG message;
while( ::PeekMessage( &message, NULL , WM_MIN, WM_MAX, PM_NOREMOVE ) )
{
::AfxPumpMessage();
}
}
它工作正常!但是我不知道AfxPumpMessage()如何工作?如何避免死锁?
有人帮我吗?提前致谢。
最佳答案
您的代码运行一个繁忙的循环。发出信号时,外部while
循环终止。在此之前,循环会忙于运行并调度消息。这使主线程可以在子线程上等待,还可以响应子线程发送的消息。
实际上,对PeekMessage
的调用是毫无意义的。这是没有意义的,因为AfxPumpMessage
将执行相同的操作,并泵送所有排队的消息。
如我所说,您的外部循环是一个繁忙的循环。你真的不想要那个。浪费CPU周期什么都不做是没有意义的。代替WaitForSingleObject
,您应该使用MsgWaitForMultipleObjects
。这使您可以在线程上等待,并能够分派消息。
假设您不想处理排队的消息,而只想分派已发送的消息,则循环可能如下所示:
while( ::MsgWaitForMultipleObjects(1, &hThread, FALSE, INFINITE,
QS_SENDMESSAGE) == WAIT_OBJECT_0 + 1 )
{
MSG message;
::PeekMessage(&message, 0, 0, 0, PM_NOREMOVE);
}
这不会处理排队的消息。如果确实需要处理这些内容,则循环看起来会有些不同。
关于c++ - AfxPumpMessage()用于什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21304232/