作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个主线程和一个子线程。在子线程中,我向主线程发送消息。在主线程中,我称之为:
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/
我有一个主线程和一个子线程。在子线程中,我向主线程发送消息。在主线程中,我称之为: while( ::WaitForSingleObject(hThread, 0) == WAIT_TIMEOUT )
我是一名优秀的程序员,十分优秀!