我有一个主线程和子线程。
在子线程中,我将消息发送到主线程。
在主线程中,我称之为:

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/

10-09 08:20