多线程:PostThreadMessage 消息可能会丢失

在编写多线程程序时,通常都有如下的设计方案:

在UI主线程中,创建后台worker线程;这个worker线程在后台完成一定的任务之后,需要通知UI主线程。

后台worker线程主动通知UI主线程,我们可以使用PostMessage()和PostThreadMessage()。

 

在开发过程中,发现一个问题,所以在本文中提醒大家,如下:

使用PostThreadMessage()发送一个消息给UI主线程后,在某些情况下,这个消息有可能会丢失,UI主线程根本就收不到。

 

在什么哪些情况下,会丢失呢?

(a) 当UI主线程正好有一个模式对话框弹出的情况。

(b) 用户正在对UI主窗口进行一些UI上的操作,比如调整窗口大小。。。。

 

其实MSDN上,已经明确说明这个问题了。查看PostThreadMessage(),其中在remarks里有一段话,如下:

 

“Messages sent by PostThreadMessage are not associated with a window. As a general rule, messages that are not associated with a window cannot be dispatched by the DispatchMessage function. Therefore, if the recipient thread is in a modal loop (as used by MessageBox or DialogBox), the messages will be lost. To intercept thread messages while in a modal loop, use a thread-specific hook.”

 

 

所以,上面所说的(a)种情况,模式对话框有自己的消息循环就是msdn里说的这个情况。

(b)种情况,按照这篇文章http://www.tech-archive.net/Archive/VC/microsoft.public.vc.mfc/2007-10/msg00156.html所说,也刚好是处于一个modal loop中。(注:根据我的实验,一直调整主窗口大小,后台线程post过来的消息就丢失了。)

 

所以结论是:“Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads”。请看:http://dev.csdn.net/article/78941.shtm

 

所以,不用使用PostThreadMessage()给UI线程(UI线程就是“创建了一个窗口的”线程)发送消息。

而请使用PostMessage()!PostMessage()就不会丢失,即使在上述所说的那2种情况下。 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值