MFC主线程使用WaitForSingleObject阻塞的问题

MFC 等待线程退出的方法 在MFC程序的主线程中如果使用WaitForSingleObject等线子线程,而子线程里使用了有关于消息的函数,比如SetWindowText,InsertItem,SetItemText这些函数,就有会导致主主线程阻塞问题优化函数OnBnClickedOk():主线程出现阻塞问题的原因是,因为SetWindowText调用了SendMessage,借助了消息循环,然后主线程又Waitxxxxx,必然会阻塞,最终导致工作线程Crash掉了。 阅读详情

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

}


 

C++程序中 WaitForSingleObject 函数的诸多用途与使用场景总结 本文详细介绍WaitForSingleObject函数在多线程编程中的多种使用场景,包括在多线程之间实现锁的等待、线程中实现Sleep、监测线程或进程是否退出等。 阅读详情

相关推荐

多线程解决mfc对话框未响应、卡死问题

多线程解决mfc对话框未响应、卡死问题

MFC WaitForSingleObject函数

WaitForSingleObject 函数SyntaxParametersReturn ValueRemarks Waits until the specified object is in the signaled state or the time-out interval elapses. 【等待,直到指定的对象处于信号状态或超时间隔结束。】 To enter an alertable wait state, use the WaitForSingleObjectEx function. To wa

sty_app的博客 1736

飞秒激光加工石英玻璃的COMSOL多物理场仿真研究

多物理场仿真是现代工程研发的重要工具,通过耦合电磁、热传导和流体力学等物理场,可以准确预测复杂工况下的材料行为。COMSOL Multiphysics作为主流仿真平台,其双温模型能精确描述飞秒激光加工中的电子-声子耦合过程。这种仿真技术可显著降低实验成本,在微纳加工领域尤为关键。针对石英玻璃这类光学材料,仿真能有效优化激光参数,实现亚微米级精度的冷加工。研究显示,结合移动网格技术和自定义材料状态函数,可以准确预测烧蚀形貌与热影响区分布,为光学器件和微流控芯片制造提供可靠工艺指导。

weixin_29290863的博客 240

MFC 多线程WaitForSingleObject死锁

遇到一种情况,在子线程程中调用了主线程方法,再使用多线程同步的话,会死锁,经过度娘的询问,发现也有朋友遇到同样的问题,于是写了一个测试代码如下: MyMutex g_mutex;//自己封装的Mutex,简单的APi封装 bool g_exit=false; HANDLE g_hThread; UINT DoWork(LPVOID lp) { CMFC_TEST_MULTITHREADDlg

小乌龟的博客 3265

SAP ERP与金蝶云星空的集成案例(新能源光伏行业)

通过建设PLM、SAP、MES、WMS、SCADA、EAM等多系统集成的工业互联网平台作为数字化工厂的控制中枢,不仅可以实现人员、设备、物料、工艺参数、产品等生产全流程追溯管理,同时也可以根据数据采集进行生产现场的控制调节,最大程度降低能耗水平。销售订单创建下推金蝶采购订单创建修改、销售订单创建下推金蝶销售订单创建修改、销售发货过账下推金蝶采购入库单、销售发货过账下推金蝶销售出库单:在SAP ERP系统创建销售订单、销售发货过账单后推送到云星空系统,进行采购/销售订单的创建修改、完成物料的入库和出库流程。

集信通 1616

Excel数字变成了小数点+E+17?这些方法帮你解决!

本文介绍了三种解决Excel中数字变成小数点+E+17问题的方法:通过下拉箭头或右键菜单设置单元格格式为文本、使用TEXT函数将科学计数法转换为文本。这些方法各有优缺点,适用于不同的场景和需求。在实际应用中,我们可以根据具体情况选择合适的方法来解决问题。通过以上方法,我们可以轻松地从繁琐的小数点+E+17问题中解脱出来,更便捷地处理Excel中的数字。希望本文能够帮助到您,让您在使用Excel时更加得心应手!

nntxthml的博客 1246

MFC主线程使用WaitForSingleObject阻塞的问题 http://blog.youkuaiyun.com/sysprogram/article/details/17383455

MFC主线程使用WaitForSingleObject阻塞的问题 2013-12-17 21:10 2339人阅读 评论(1) 收藏 举报  分类: VC/MFC(125)  版权声明:本文为博主原创文章,未经博主允许不得转载。 在MFC程序的主线程中如果使用WaitForSingleObject等线子线程,而子线程里使用了有关于消息的函数,比

诺尔曼 2167

【AI知识点】启发式算法(Heuristic Algorithms)

启发式算法(Heuristic Algorithms) 是一种基于经验、直觉和局部优化的求解问题的算法,尤其适用于解决计算复杂度高、规模庞大的问题。它们通过简化问题、局部搜索和快速近似,提供了一种在短时间内获得“足够好”解的途径。虽然启发式算法无法保证全局最优解,但它们在实际应用中广泛使用,特别是在优化问题、任务调度和机器学习等领域。

AI完全体 3031

VC++关于使用WaitForSingleObject等待线程安全退出,出现死机问题的解决

1、MFC项目场景如下: 主线程新建了子线程: CWinThread *m_pThread_SysReset; m_pThread_SysReset=AfxBeginThread(ThreadSysResetthis); 主界面等待子线程退出时,主线程主动调用了函数: WaitForSingleObject(m_pThread_SysReset->m_hThread, INFIN...

$firecat利白的代码足迹$ 6262

Comsol 基于局部谐振压电材料的可调水下低频吸声

它通过建立基于LRPM的水下吸声理论模型,从有效材料的角度分析可调吸声特性和吸声机理,进一步提高吸声性能。该研究发现,薄的LRPM层可以在目标低频范围内实现出色的吸声效果,而这个目标低频可以通过操纵谐振分流电路进行主动调谐。通过引入局部谐振压电超材料和可调谐的谐振分流电路,研究人员能够有效地控制水下低频吸声特性,并且在吸声带宽方面取得了显著的改进。通过利用薄的活性超材料层,LRPM在水声吸声方面展现出潜力,并且通过操纵谐振分流电路,可以实现对吸声特性的精细控制。

weixin_45382232的博客 786

免ROOT、不刷机、不依赖Xposed实现Android改机的思路

最近在一个项目中需要模拟多种Android设备的环境。无奈市面上的大部分改机工具,要么需要ROOT权限,要么依赖Xposed,甚至还得重启设备。为了实现更灵活、更干净的改机方式,我开始了漫长的技术探索,最终找到了免ROOT、不刷机、拒绝Xposed的实现路径。Android_IDIMEI手机序列号手机型号、品牌、CPU型号等硬件信息GPS位置、Wi-Fi参数、通话记录、短信等软硬件数据这些信息通常用于标识设备唯一性,而改机就是对这些标识数据进行模拟或篡改。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2667

在MFC中使用WaitForSingleObject出现假死

前几天在编写远控的时候,需要在GUI线程之外创建一和

bobopeng 5074

YOLOv10改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型

本文记录的是基于MobileNet V3的YOLOv10目标检测轻量化改进方法研究。的模型结构是通过得来的,其中的基础模块结合了的深度可分离卷积、的线性瓶颈和倒置残差结构以及MnasNet中基于挤压和激励的轻量级注意力模块,使模型在性能、效率和灵活性方面都具有显著的优势。本文在替换骨干网络中配置了原论文中的small和large2种模型,以满足不同的需求。

Limiiiing的博客 514

MFC子线程向主线程SendMessage或者直接操作UI时可能导致子线程的退出异常

参考http://www.cnblogs.com/findumars/p/3948427.html首先通过图来形象了解下消息机制: SendMessage与PostMessage的区别:PostMessage 把消息投递到消息队列后,立即返回; SendMessage 把消息直接送到窗口过程处理,处理完才返回。(?是否因窗口是否为本线程所有而异)bool CMainFrame::CloseX

uhoh5099的博客 4732

【Codecs系列】HEVC-SCC(一):核心技术介绍

DATE: 2020.6.4【Tags: HEVC SCC】 1、参考网址 2、SCC简介 3、HEVC-SCC核心技术

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 4803

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

主线程中调用WaitForSingleObject函数造成的死锁问题

这二天刚好要用多线程连接一个服务器,本来一个很简单的问题,被搞的困惑了半天,感觉终于弄清楚了,记录下,测试的代码很简单,但是就是一直崩溃,代码如下:UINT ThreadTest(LPVOID lParam) { /* //连接服务器 */ Sleep(5000); AfxMessageBox(_T("连接成功")); ...

weixin_33881041的博客 1157

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)

下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗? 线程函数: DWORD WINAPI ThreadProc(     while(!bTerminate)     {         // 从一个链表中读取信息并且插入到CListCtrl中         // CListCtrl的句柄是通过线程参数传递进来的         for(;;)        

田群的专栏 1043

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

等待线程退出 MsgWaitForMultipleObjects和WaitForSingleObject

为什么要用MsgWaitForMultipleObjects? 主要是多线程、防止MFC消息阻塞、监控某些消息 在MFC多线程中如果要等待工作线程的退出(工作线程可能有控件的使用或者Postmessage) //草稿 while(TRUE) {     DWORD dwObject = MsgWaitForMultipleObjects();//QS_ALLEVENTS|QS_AL

death10001的专栏 2115

MFC线程退出方法

MFC使用AfxBeginThread创建线程退出方法: CWinThread * myThread; //线程 bool isThreadBegin = false; //线程退出/执行控制 //创建线程 void CDlg::OnButtonCreateThread() { isThreadBegin = thue; //运行线程...

zhangyao7751的博客 8770

mfc 非阻塞延时

从网上找的非阻塞延时方法,帮了我大忙。 struct XSleep_Structure { int duration; HANDLE evenHandle; }; // 非阻塞延时 void XSleep(int nWaitInMsecs) { XSleep_Structure sleep; sleep.duration = nWaitInMsecs; sleep.evenHandl

fulianzhou的专栏 6110

MFC多线程编程- 在主线程中使用MsgWaitForMultipleObjects等待子线程退出,而非WaitForSingleObject或WaitForMultipleObjects

转载自: https://blog.youkuaiyun.com/nefeithu123/article/details/4250002 1.工作线程给主线程发消息使用的是SendMessage和PostMessage函数。这两个函数的区别在于SendMessage函数是阻塞方式,而PostMessage函数是非阻塞方式。如果不是严格要求工作线程与主线程必须同步执行,则推荐使用PostMes...

u010096608的博客 966

MFC-线程 WaitForSingleObject 和 WaitForMultipleObjects

//用于单个(共2个参数) //等待通知INFINITE无限时间 0立即,1000是1秒 if ((wr = WaitForSingleObject(hThread, INFINITE)) == WAIT_FAILED) { puts("thread wait error"); return -1; } //用于多个及单个(共4个参数 ) WaitForMultipleObject...

qq_42914451的博客 635

记一次进程线程dll和MFC消息循环的系列问题

主要问题 1、主线程中慎用waitforsingleobject。本次问题出现在当进程B中弹出一个dlg并设置进程A为其父窗口,之前使用setparent失败了,所以直接在构造函数中把A的句柄穿进去就好了(findwindow来查找A的句柄),但是由于A中使用了waiforsingleobject后,当弹出的dlg使用domodal时,此时向父窗口发送消息,而A此时为挂起状态,故造成消息阻塞,d

gldcpp的博客 1148

MFC之线程(开启、挂起、恢复、终止)

MFC之线程(开启、挂起、恢复、终止) MFC中线程有UI线程和工作者线程两种,下面分享一下MFC工作者线程的相关操作,包括线程的开启、挂起、恢复和终止。 流程:1.列举用法 2.案例展示 一:MFC线程的开启 CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, //线程的入口函数 LPVOID pParam, ...

随心漂流的博客 9045

对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决

原文来自:http://blog.youkuaiyun.com/silvervi/article/details/5874212 红色字为博主添加: 问题描述:AfxBeginThread创建一个线程后,在线程中操作UI的控件,例如EDIT。在UI的button里停止线程,并等待结束,一般用WaitforsingleObject,但是这个函数会导致UI消息阻塞,如果这个时候线程里正好操作UI控件并需要

LYJ个人博客,记录技术、八卦、生活,分享各种心得,期待与朋友们一同进步 4736
上一篇: exe的dll加载过程
下一篇: 在内存中读取函数的ShellCode并执行
sysprogram
博客等级 码龄17年 298粉丝 442原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值