【经验】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。(不详细,不建议看)
【经验】C++|在MFC子线程中,通过正确的传参,访问主线程对话框程序的控件对象、调用类函数的更多相关文章
- [转]MFC子线程中更新控件内容的两种办法
一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线 ...
- 【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
题目如下: 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50次 思路如下: 子线程语主线程为互斥,可用SYNCHRONIZED.很容易想 ...
- vs2015c++/MFC入门知识全集/实例规范书籍视频下载孙鑫c++对话框计算器基础控件使用教程系列
VIP教程可免费看.可免费下载前部分试看教程地址:http://dwz.cn/4PcfPk免费下载地址:http://dwz.cn/mfc888 本课程目录 67章 [MFC项目开发第01天]Wind ...
- iOS开发之线程间的MachPort通信与子线程中的Notification转发
如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...
- android 不能在子线程中更新ui的讨论和分析
问题描写叙述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是仅仅能在主线程中更改 ui.子线程要 ...
- MFC在子线程中创建窗口(PostMessage方法)
1.创建子线程 C++创建线程的方式比较多 1)最简单易用的<thread>头文件,但是这种方法创建的子线程中无法给主线程PostMessage消息(也可能是我操作有误,总之没成功) 2) ...
- [转]MFC子线程更改图像数据后更新主窗口图像显示方法
程序思路是由外部的输入输出控制卡发出采集图像信号,之后相机采集图像得到图像数据指针,接收图像数据指针创建成图像最后显示到MFC对话框应用程序的Picture Control控件上,同时,为了标定相机位 ...
- Android多线程之(一)View.post()源码分析——在子线程中更新UI
提起View.post(),相信不少童鞋一点都不陌生,它用得最多的有两个功能,使用简便而且实用: 1)在子线程中更新UI.从子线程中切换到主线程更新UI,不需要额外new一个Handler实例来实现. ...
- 【转载】Delphi7从子线程中发送消息到主线程触发事件执行
在对数据库的操作时,有时要用一个子线程来进行后台的数据操作.比如说数据备份,转档什么的.在主窗口还能同是进行其它操作.而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上 ...
- 在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()
在子线程中new一个Handler为什么会报以下错误? java.lang.RuntimeException: Can't create handler inside thread that has ...
随机推荐
- Codeforces 11D A Simple Task 题解 [ 蓝 ] [ 状压 dp ]
思路不难想,细节比较多. 思路 观察到 \(n \le 19\) ,首先想到状压 dp . 于是自然地定义 \(dp[j][i]\) 为:抵达点的状态为 \(i\) ,且此时在点 \(j\) 时,简单 ...
- WPF 调试工具使用
参考链接: https://supportcenter.devexpress.com/ticket/details/t720001/how-to-use-the-snoop-utility-to-in ...
- kubsphere应用系列(三)-创建手动流水线
准备工作 1.1 创建凭证 1.2 添加代码仓库 第一步创建流水线 第二步配置流水线 1.1选择CI/CD模板 1.2删除多余阶段 1.3 配置git仓库信息 1.4配置docker仓库信 ...
- el-cascader 最后一级不显示出来
1.业务背景 业务需要做一个父级查询,父级查询的级联组件不显示最后一级,其他层级均显示 2.解决办法 1.页面设计见上文 TypeError: Cannot read properties of nu ...
- 结构化语句header nav aside main article section footer
点击查看代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- Vulnhub-Hackme
一.靶机搭建 选择扫描虚拟机 选择路径即可 二.信息收集 靶机信息 Name: hackme: 1 Date release: 18 Jul 2019 难度:初级,目标是通过web漏洞获得有限的权限访 ...
- Linux 安装 MySQL 8.0
目录 下载 安装数据库 修改mysql配置文件(若没有则新建) 安装并初始化mysql 查看mysql密码 配置启动 登录MySQL 修改密码 配置远程连接 配置防火墙 常见错误 Windows 安装 ...
- Manus,没有秘密「注解版」
近来Manus走红,「争论」不断,我也在前文<Manus爆火,是硬核还是营销?>中阐述过自Manus发布后,行业讨论以及开源复刻的信息,以及我们如何结合蚂蚁图计算(TuGraph)技术,实 ...
- Java SE 24 新增特性
Java SE 24 新增特性 作者:Grey 原文地址: 博客园:Java SE 24 新增特性 CSDN:Java SE 24 新增特性 源码 源仓库: Github:java_new_featu ...
- CDH6.3.2下安装部署Qualitis数据质量分析的计算服务Linkis1.3.2
快速搭建Qualitis手册 一.基础软件安装 Gradle (4.6) MySQL (5.5+) JDK (1.8.0_141) Linkis(1.0.0+), 必装Spark引擎.如何安装Link ...