【经验】C++|在MFC子线程中,通过正确的传参,访问主线程对话框程序的控件对象、调用类函数
引言
MFC中子线程操控窗口的控件的难点在于:
子线程函数不属于窗口类。
比方说,
窗口类CMFCApplication3Dlg
的点击事件函数如下:
void CMFCApplication3Dlg::OnBnClickedCheck2()
{
// 其中uploadThread为子线程函数
CWinThread* mythread = AfxBeginThread(uploadThread, NULL);
}
而子线程的函数却只能这样:
UINT uploadThread(LPVOID lpParam){}
那么,用子线程访问CMFCApplication3Dlg
的类成员呢?
答案——传参。
我的需求有两个:
① 在子线程中控制控件;
② 在子线程中使用类函数。
前者传递CWnd*
句柄指针即可,而后者传递Dlg*
指针即可。全程不需要用到消息机制,就硬传参。
可以看一下2013年这篇博客,它用到了消息机制,也传了参,他是对的,可是这真的很麻烦,不是吗?CSDN博客:MFC子线程访问主线程对话框程序的控件对象_2013-11-27 14:17:08
开始
首先,构建一个参数结构体:
typedef struct Param1 {
CMFCApplication3Dlg* pDlg;
CWnd* upBtn;
CWnd* dlBtn;
CWnd* upEdit;
CWnd* dlEdit;
}uploadParam;
uploadParam param_content; //全局定义参数结构体
然后,在你需要的时候,对结构体变量赋值,并传递到子线程里去:
注意下面代码中的
this
,对于我这种小白来说,根本不知道还有这操作。
void CMFCApplication3Dlg::OnBnClickedCheck2()
{
param_content.pDlg = this;
param_content.upBtn = GetDlgItem(IDC_BUTTON6);
// 其中uploadThread为子线程函数
CWinThread* mythread = AfxBeginThread(uploadThread, ¶m_content);
}
传递进去之后,再在子线程中取我们的参数:
UINT uploadThread(LPVOID lpParam)
{
uploadParam* param = (uploadParam*)lpParam;
param->upBtn->SetWindowTextA("test");
//MyClassFunc是你在类里面自定义的函数
param->pDlg->MyCLassFunc(123);
}
就行了,贼容易。
可能遇到的问题
① CreateThread
创建线程无法传参:CreateThread
是Win32 API
中的。MFC要用AfxBeginThread
创建线程。
② MSDN官方文档:使用 C++ 和 MFC 进行多线程编程_MSDN。(不详细,不建议看)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix