在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);
}

MFC主线程使用WaitForSingleObject阻塞的问题相关推荐

  1. iOS面试:主线程如何进行阻塞?

    前言: 今天在群里, 有个小伙伴问了一个问题, 他们和js交互的时候, 需要等待js的一个回调. 主线程调用一个网络请求, 然后要等网络请求的结果回来之后, 然后在return. 他说, 他们之前是根 ...

  2. 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)

    下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗? 线程函数:     DWORD WINAPI ThreadProc()     {         while(!bTerminate) ...

  3. 在用户线程/主线程中推荐MsgWaitForMultipleObjects代替WaitForSingleObject和WaitForMultipleObjects()函数

    在多线程编程中,通常都需要线程间的同步,一个线程要等待另一个线程的事件才继续执行,一般的做法是采用WaitForSingleObject和WaitForMultipleObjects()函数来实现. ...

  4. MFC子线程访问主线程对话框程序的控件对象

    最近在使用 VC 开发软件时需要用到多线程同步来解决开发过程中遇到的问题.本来以为只要象控制台程序一样,在主线程创建子线程,并设置好相应的对象事件就能解决问题,但是等到真正做起来,才在实践中发现原来事 ...

  5. 主线程中慎用WaitForSingleObject (WaitForMultipleObjects)

    主线程中慎用WaitForSingleObject (WaitForMultipleObjects) 下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗? 线程函数: DWORD WINAP ...

  6. 模态对话框阻塞主线程的话不影响其他线程操作主线程控件(不阻塞)

    Task.Factory.StartNew(() => {Thread.Sleep(5000);this.Invoke(new Action(() => {this.button7.Tex ...

  7. iOS程序UI主线程和定时器相互阻塞的问题

    解决iOS程序UI主线程和定时器相互阻塞的问题 转载于:https://www.cnblogs.com/hl666/p/3784838.html

  8. redis主线程阻塞的情形

    1.redis使用fork创建子进程就行rdb或aof重写操作时,fork子进程的过程会阻塞主进程,阻塞时间取决于主进程的内存大小–这里你是否觉得有疑问:fork子进程的时候主进程和子进程是采用共享内 ...

  9. Android主线程阻塞处理及优化

    一.前期基础知识储备 当一个应用程序启动之后,android系统会为这个应用程序创建一个主线程(Main Thread),它负责渲染视图,分发事件到响应监听器并执行,对界面进行轮询的监听.因此,一般也 ...

最新文章

  1. php中getdistance函数_php计算两个经纬度地点之间的距离
  2. HashMap之微代码解析-总结整理
  3. Android O 7.0 启动优化的一些思路
  4. java wate_Trapping Rain Water leetcode java
  5. 实现DDD领域驱动设计: Part 4
  6. java 方法 示例_Java集合syncedSet()方法与示例
  7. 基础知识(十)C++常用函数.txt
  8. Vcenter6.5 Administrator账户密码忘记或者过期无法登陆解决办法
  9. Pytorch极简入门教程(十六)——预训练网络ResNet101微调
  10. 工业产品表面缺陷检测方法——综述
  11. PS套索工具抠图及快捷键
  12. [生存志] 第99节 白起奋威屠百万
  13. Arduino使用人体红外传感器
  14. 对ABAP程序调优的学习(三)并行并发读取
  15. 苹果电脑:快捷键使用
  16. H3C服务器带外默认账号和密码,H3C产品的默认密码是多少?
  17. 阿特拉斯拧紧枪说明书_ATLAS 阿特拉斯 DS手枪式电动拧紧枪
  18. HTML5前期学习准备(一)
  19. XSS相关:知其所以然—浏览器是如是解码的
  20. 安装finalshell 高级版(绿色版)

热门文章

  1. 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)
  2. C Primer Plus(第五版)7
  3. 自定义实现ProgressDialog样式的Dialog
  4. ASP.NET Page和Response 输出js的区别
  5. 初识德国的小朋友兴趣课程
  6. 唐骏《我的成功也可以复制》1,盖婚房
  7. 11月27日struts项目练习评审
  8. MFC 基础知识:主对话框与子对话框(一)
  9. iOS之深入解析Block的底层原理
  10. SwiftUI之深入解析如何创建列表展示视图和列表如何导航跳转新页面