MFC主线程使用WaitForSingleObject阻塞的问题 http://blog.csdn.net/sysprogram/article/details/17383455
来源:互联网 发布:php get参数加密 编辑:程序博客网 时间:2024/05/23 01:18
MFC主线程使用WaitForSingleObject阻塞的问题
分类:
版权声明:本文为博主原创文章,未经博主允许不得转载。
在MFC程序的主线程中如果使用WaitForSingleObject等线子线程,而子线程里使用了有关于消息的函数,比如SetWindowText,InsertItem,SetItemText这些函数,就有会导致主主线程阻塞问题,看看这段代码。
- DWORD WINAPI ThreadProc(
- LPVOID lpParameter // thread data
- )
- {
- CMFCWaitThreadDlg *pDlg = (CMFCWaitThreadDlg*)lpParameter;
- for (int i=0;i<=10;i++)
- {
- OutputDebugStringA("test");
- Sleep(2000);
- pDlg->SetWindowText(_T("HEHE"));
- }
- return true;
- }
- void CMFCWaitThreadDlg::OnBnClickedOk()
- {
- // TODO: 在此添加控件通知处理程序代码
- DWORD dwID;
- HANDLE hThread;
- hThread = CreateThread(0,0,ThreadProc,this,0,&dwID);
- DWORD dwRet = WaitForSingleObject(hThread,INFINITE);
- if (dwRet == WAIT_OBJECT_0)
- {
- MessageBoxA(0,"Thread exit",0,0);
- }
- }
主线程出现阻塞问题的原因是,因为SetWindowText调用了SendMessage,借助了消息循环,然后主线程又Waitxxxxx,必然会阻塞,最终导致工作线程Crash掉了。还好微软提供了另一个函数MsgWaitForMultipleObjects,用这个就能搞定了,看看下面这段代码,把WaitForSingleObject那一段给替换了,跑一跑试试,就没问题了。
- DWORD WINAPI ThreadProc(
- LPVOID lpParameter // thread data
- )
- {
- CMFCWaitThreadDlg *pDlg = (CMFCWaitThreadDlg*)lpParameter;
- for (int i=0;i<=10;i++)
- {
- OutputDebugStringA("test");
- Sleep(2000);
- pDlg->SetWindowText(_T("HEHE"));
- }
- return true;
- }
- void CMFCWaitThreadDlg::OnBnClickedOk()
- {
- // TODO: 在此添加控件通知处理程序代码
- DWORD dwID;
- HANDLE hThread;
- hThread = CreateThread(0,0,ThreadProc,this,0,&dwID);
- while(TRUE)
- {
- DWORD result ;
- MSG msg ;
- result = MsgWaitForMultipleObjects(1, &hThread,
- FALSE, INFINITE, QS_ALLINPUT);
- if (result == (WAIT_OBJECT_0))
- {
- break;
- }
- else
- {
- PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
- DispatchMessage(&msg);
- }
- }
- MessageBoxA(0,"Thread exit",0,0);
- }
0 0
- MFC主线程使用WaitForSingleObject阻塞的问题 http://blog.csdn.net/sysprogram/article/details/17383455
- MFC主线程使用WaitForSingleObject阻塞的问题
- selenium使用中遇到的问题,转自:http://blog.csdn.net/funi16/article/details/9036753
- MFC图象闪烁的解决办法http://blog.csdn.net/tiaotiaoyly/article/details/2516235
- PhoneStateListener的使用及其造成的内存泄漏问题分析(转自http://blog.csdn.net/firedancer0089/article/details/60121128)
- boost的安装问题 http://blog.csdn.net/begtostudy/article/details/1879213
- 类模版的分离编译问题 http://blog.csdn.net/woshishuizzz/article/details/8648440
- printf的重入问题及解决方法 http://blog.csdn.net/iefswang/article/details/7523458
- 出现chkstk.asm问题的解决方式之一http://blog.csdn.net/feixuedudiao/article/details/8625039
- 检查C语言的内存问题 参考网址:http://blog.csdn.net/sduliulun/article/details/7732906
- C++使用localtime函数需要注意的地方http://blog.csdn.net/shellching/article/details/8114266
- UNIX SIGIO信号的使用http://blog.csdn.net/msda/article/details/8090748
- libxml的使用(1)--读取xml http://blog.csdn.net/hdutigerkin/article/details/7546899
- libxml的使用(2)--读取节点属性 http://blog.csdn.net/hdutigerkin/article/details/7546907
- 使用信号实现异步通知机制的例子 http://blog.csdn.net/buaa_shang/article/details/9103155
- C++中智能指针的设计和使用 http://blog.csdn.net/hackbuteer1/article/details/7561235
- 关于pthread里面一些函数的使用心得! http://blog.csdn.net/lishuhuakai/article/details/12010229
- 类模板的定义和使用 http://blog.csdn.net/djinglan/article/details/6689839
- 最大最小流整理
- Servlet生命周期和JSP
- Spark核心概念
- dede 两个网站共用一个数据库图片路径问题
- 递归问题
- MFC主线程使用WaitForSingleObject阻塞的问题 http://blog.csdn.net/sysprogram/article/details/17383455
- [TwistedFate]图片异步加载,KVO
- 转发,Servlet异常
- 154.Oracle数据库SQL开发之 JAVA——使用JDBC包
- 源码解析 Universal Image Loader
- ACM比赛的技巧
- 比较转发与重定向和Cookie
- NSNotificationCenter 的使用详解
- win64位系统安装numpy