c++ - AfxPumpMessage() 用于什么?

标签 c++ visual-c++ mfc

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

while( ::WaitForSingleObject(hThread, 0) == WAIT_TIMEOUT )
{
 MSG    message;
 while( ::PeekMessage( &message, NULL , WM_MIN, WM_MAX, PM_NOREMOVE ) )
 {
::AfxPumpMessage();
 }
}

它工作正常!但我不知道 AfxPumpMessage() 是如何工作的?如何避免死锁? 有人帮帮我吗?提前致谢。

最佳答案

您的代码运行一个繁忙的循环。外层 while 循环在线程收到信号时终止。在此之前,循环运行繁忙并发送消息。这就是允许主线程在子线程上等待,同时也响应子线程发送的消息。

事实上,调用 PeekMessage 是毫无意义的。这是毫无意义的,因为 AfxPumpMessage 会做同样的事情,并抽取所有排队的消息。

正如我所说,您的外循环是一个繁忙的循环。你真的不想要那个。消耗 CPU 周期来无所事事是没有意义的。您应该使用 MsgWaitForMultipleObjects 而不是 WaitForSingleObject。这允许您在线程上等待,并能够发送消息。

假设您不想处理排队的消息,只想分派(dispatch)已发送的消息,您的循环可能如下所示:

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/

相关文章:

c++ - 为什么/如何清理静态的机制获得允许它调用私有(private)成员的访问权限?

dll - MSVC dll、静态库和导入库的正确命名约定是什么

c++ - 从 VC++ 调用 R 函数

c++ - CWinThread 查询 (MFC)

c++ - 如何在不暴露类细节的情况下传递函数指针

c++ - 没有句柄的动态分配变量会发生什么? (C++)

C++ 如何检查数组中的所有值是否不同?

c++ - 如何从 vector<char> 转换为数字整数

c++ - 如何在 MFC 的功能区文本框中实现数据验证

c++ - CRichEditCtrl 在使用 MFC 编写的共享 dll 中无法正常工作?