对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
来源:互联网 发布:网络缩写英文字母 编辑:程序博客网 时间:2024/05/21 17:40
原文来自:http://blog.csdn.net/silvervi/article/details/5874212
红色字为博主添加:
问题描述:AfxBeginThread创建一个线程后,在线程中操作UI的控件,例如EDIT。在UI的button里停止线程,并等待结束,一般用WaitforsingleObject,但是这个函数会导致UI消息阻塞,如果这个时候线程里正好操作UI控件并需要用到SendMessage,则线程在等待消息发送完,WaitforsingleObject在等待线程,而WaitforsingleObject又阻塞了消息,这样就导致了死循环。下文为解决方法,已经省略,全部可以参考原文地址:
还可以看出:MsgWaitForMultipleObjects实际上在这其中并没有起到什么实质性的作用,只是定期返回而已,那么根据此,可以用固定时间的WaitForSingleObject来代替MsgWaitForMultipleObjects,并且循环等待 ;同时,我们也没有必要手动DispatchMessage,只需要PeekMessage即可,需要注意的是如果删除了DispatchMessage,在PeekMessage时不能将消息从队列取走。代码如下:
DWORD dwRet = 0; MSG msg; while (TRUE) { dwRet = WaitForSingleObject(m_hThread, 50); switch(dwRet) { case WAIT_OBJECT_0: break; //break the loop case WAIT_TIMEOUT : PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); continue; default: break; // unexpected failure } break; }
经过测试,代码运行正确!
当然,由于MsgWaitForMultipleObjects是基于消息驱动的返回,WaitForSingleObject只是普通的定时返回,而本文的情况就是由于消息阻塞造成的,所以MsgWaitForMultipleObjects比WaitForSingleObject在应用时时效性更好,如果改成WaitForSingleObject,在测试中感觉会有略为滞后,所以实际还是以MsgWaitForMultipleObjects为佳。
- 对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
- 对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
- 对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
- 对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
- 对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
- 程序退出时使用WaitForSingleObject导致程序阻塞的原因及解决方法
- WaitForSingleObject等待退出线程bug
- 解决线程中有阻塞情况下程序退出不了
- 等待线程退出 MsgWaitForMultipleObjects和WaitForSingleObject
- 等待线程结束的高手--WaitForSingleObject
- WaitForSingleObject 等待线程句柄
- WaitForSingleObject 等待线程句柄
- 导致等待事件的常见原因及解决方案
- 线程阻塞的原因
- 线程阻塞的原因
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 可变类型开放数组Demo
- 采用execSQL()和rawQuery()方法完成数据的添删改查
- 如何让虚拟目录里面的webconfig不继承网站的设置
- [RTT例程练习] 1.7 优先级翻转之优先级继承
- 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
- 对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
- BlowFish算法加密解密
- 诉说一个屌丝20多年的点点滴滴
- shell中sed的使用
- spring和BlazeDS 集成配置后台
- VIM下,在文件及目录中查找字符串的方法 (vimgrep)
- poj 1252 Euro Efficiency(多次完全背包)
- 使用TSung对Jabber服务器openfire进行压力测试
- linux信号