MFC工作线程的创建与控件控制

本文介绍了在MFC应用中如何使用工作线程避免界面卡顿,通过AfxBeginThread创建线程并利用DoEvent处理消息,确保界面响应。同时,讨论了工作线程中控制控件的三种方法,包括传递控件变量、发送消息和重新获取控件句柄,以实现线程间安全通信。
摘要由CSDN通过智能技术生成

为什么要用MFC?
不是专业开发,只是做个工具。

MFC的主界面是在界面线程运行的,如果在Button的响应函数中写了一个用时很长的函数,那么就要考虑运用工作线程,否则MFC程序主界面就会卡住不动,直到函数运行完才会响应消息。

开启工作线程的正确姿势

那就是用MFC封装好的线程函数AfxBeginThread。

CString strFolderPath = L"C:\\";
CWinThread* pThread = NULL;

pThread = AfxBeginThread((AFX_THREADPROC)BeginScan, szFolderPath, THREAD_PRIORITY_IDLE);//szFolderPath是参数,路径
		DoEvent();
		if(pThread)
		{ 
			do
			{
				dwRet = ::MsgWaitForMultipleObjects(1, &pThread->m_hThread, FALSE, INFINITE, QS_ALLINPUT);
				if (dwRet != WAIT_OBJECT_0)
				{
					DoEvent();
				}
			} while ((dwRet != WAIT_OBJECT_0) && (dwRet != WAIT_FAILED));
		}
		if (pThread)
		{
			CloseHandle(pThread);
		}

其中DoEvent

void CMyDlg::DoEvent()
{
	MSG msg;
	if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))  //取消息,检索应用程序的消息队列,PM_REMOVE取过之后从消息队列中移除
	{
		//发消息
		::TranslateMessage(&msg);
		::DispatchMessage(&msg);
	}
}

如此方式开启工作线程,不会影响界面的操作响应。而且工作线程的权限为THREAD_PRIORITY_IDLE,不容易消耗过高CPU造成卡死。

参考链接:
https://blog.csdn.net/xl19900502/article/details/50342021

工作线程中控制控件

由于我们写的函数是运行在工作线程之下的,所以不能直接调用界面线程的主对话框类对象中的方法,否则会引起崩溃。
这时解决方法有以下几种:
一、把需要更改的控件变量或控件句柄,当作参数传到AfxBeginThread创建的函数中。
这样的缺点是如果需要更改的控件比较多时,需要传很多参数。要更改的控件比较少时可以这样搞。

二、向界面线程发送消息更改控件状态。
在工作线程中不能使用UpdateData来更新主线程中的数据,只能在主线程中使用。界面的东西,最好就是用主线程(界面线程)去执行相应的操作。要想在子线程(工作线程)里执行界面线程的操作,最好是向主线程发送消息。当然创建消息需要遵循固定的四步骤。
参考链接:https://blog.csdn.net/u011499425/article/details/52515216

三、在工作线程中重新获取一遍控件的句柄。
CWnd* edit = AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_EDIT1);//获取主窗口编辑框控件的句柄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摔不死的笨鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值