牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

关于多线程中使用SendMessage

如果,窗口是由非主线程创建的,那么,那个线程将会跑一个自己的窗口消息队列。调用SendMessage会切换到该线程上去执行。

主线程是个窗口线程,在另外一个工作线程中调用了窗口线程的SendMessage,那么执行的过程是:
1.工作线程挂起
2.切换到窗口线程,执行对应的消息处理
3.切换回工作线程

SendMessage : 如果指定窗口由调用线程创建,那么窗口过程会被当成一个子程序立即调用。如果指定窗口由另外一个线程创建,那么系统会切换到那个线程,并且调用合适的窗口过程。在线程之间传递的消息仅仅当接收线程执行message retrieval code才会被处理。发送线程会被堵塞直到接收线程处理完消息。但是,发送线程在等待的同时会处理收到的nonqueued messages 。为了阻止这一点,使用带有SMTO_BLOCK参数 的SendMessageTimeout .

在多线程的程序里面,最好不要操作CWnd的实例指针,而是用API函数操作HWND窗口句柄。

posted on 2009-12-19 20:07 杨粼波 阅读(4008) 评论(2)  编辑 收藏 引用

评论

# re: 关于多线程中使用SendMessage 2009-12-19 22:59 Tess

昨天刚好在MSDN上看到SendMessageTimeout函数。以前一直在工作线程中用SendMessage,导致窗口线程退出时等待工作线程从而发生死锁,没办法只能用PostMessage加Event同步。SendMessageTimeout还有个参数SMTO_ABORTIFHUNG,如果被等待的线程刮起了,等待的线程可以马上返回避免了死锁。一直很喜欢看楼主的博客,能学到很多东西!  回复  更多评论   

# re: 关于多线程中使用SendMessage 2009-12-20 03:16 杨粼波

最好是不要在工作线程中使用这个玩意!
我算是领教过了!  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理