MFC子线程向主线程SendMessage或者直接操作UI时可能导致子线程的退出异常
2016-01-14 13:43
399 查看
参考http://www.cnblogs.com/findumars/p/3948427.html
首先通过图来形象了解下消息机制:
SendMessage与PostMessage的区别:
PostMessage 把消息投递到消息队列后,立即返回;
SendMessage 把消息直接送到窗口过程处理,处理完才返回。(?是否因窗口是否为本线程所有而异)
当主线程中调用CloseXXXThread关闭子线程,主线程在等待子线程结束的时候被挂起(在执行WaitForSingleObject()时);而若此时子线程正在SendMessage或者操作UI,子线程同时又在等待主线程返回消息处理结果,于是导致死锁。当WaitForSingleObject等待超时,主线程不顾子线程是否退出继续运行,此时可能导致不可预知的问题。
扩展: WaitForMultipleObject与MsgWaitForMultipleObjects用法
windows消息之PostMessage和SendMessage的内部实现
首先通过图来形象了解下消息机制:
SendMessage与PostMessage的区别:
PostMessage 把消息投递到消息队列后,立即返回;
SendMessage 把消息直接送到窗口过程处理,处理完才返回。(?是否因窗口是否为本线程所有而异)
bool CMainFrame::CloseXXXThread() { if(m_hXXXThread != INVALID_HANDLE_VALUE) { s_bExit = true; WaitForSingleObject(m_hXXXThread, 2000); CloseHandle(m_hXXXThread); m_hXXXThread = INVALID_HANDLE_VALUE; } return true; }
当主线程中调用CloseXXXThread关闭子线程,主线程在等待子线程结束的时候被挂起(在执行WaitForSingleObject()时);而若此时子线程正在SendMessage或者操作UI,子线程同时又在等待主线程返回消息处理结果,于是导致死锁。当WaitForSingleObject等待超时,主线程不顾子线程是否退出继续运行,此时可能导致不可预知的问题。
扩展: WaitForMultipleObject与MsgWaitForMultipleObjects用法
windows消息之PostMessage和SendMessage的内部实现
相关文章推荐
- Oracle外键不加索引引起死锁示例
- SQL2008中SQL应用之- 死锁(Deadlocking)
- 详解SQL死锁检测的方法
- C#中lock死锁实例教程
- 记一次公司仓库数据库服务器死锁过程及解决办法
- Visual C++中MFC消息的分类
- 利用sys.sysprocesses检查SqlServer的阻塞和死锁
- MFC中Radio Button的用法详解
- MFC对话框中添加状态栏的方法
- MFC创建右键弹出菜单的方法
- MFC中动态创建控件以及事件响应实现方法
- C++ 关于MFC多线程编程的注意事项
- MFC程序对文件的处理方法
- MFC自定义消息的实现方法
- MFC实现在文件尾追加数据的方法
- MFC之ComboBox控件用法实例教程
- C#实现窗体与子线程的交互的方法
- C#在子线程中更新窗口部件的写法
- 深入浅出解析mssql在高频,高并发访问时键查找死锁问题
- MFC绘制不规则窗体的方法