多线程: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种情况下。 

你可能感兴趣的:(多线程:PostThreadMessage 消息可能会丢失)