【经验】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 ...
随机推荐
- jenkins+svn+tomcat
1.安装插件即可在源码管理中看见svn的选项subversion2.源码管理中配置svn的工程地址 3.点击Credentials的[添加]配置svn的用户名密码,完成后选取即可 4.配置构建触发器, ...
- 库卡KUKA机器人KRC2示教器维修常见方法
库卡KUKA机器人以稳定性而备受赞誉.作为其重要组成部分,KRC2示教器在机器人的编程.监控和调试过程中发挥着至关重要的作用.然而,就像其他任何电子设备一样,KRC2示教器在长期使用过程中也可能会遇到 ...
- python实现监控站点目录,记录每天更新内容,并写入操作日志,以便查找病毒恶意修改
问题描述:站点需要追溯代码的修改时间,以便尽早发现病毒恶意修改迹象,及时处理 运行环境:linux服务器,宝塔面板 示例代码:一.读取txt的文件路径,依次遍历所有目录下面的文件,并记录文件信息 pa ...
- C#之 Dictionary 详解
基本概念 Dictionary<TKey, TValue>是C#中用于存储键值对集合的泛型类,属于System.Collections.Generic命名空间.它允许使用键(Key)来访问 ...
- Selenium Webdriver 介绍
在前两篇文章中,主要介绍了Selenium IDE 工具及其使用和它的特点,也使用Selenium IDE和Firebug构建了一些脚本.本文,我们开始介绍不同类型的web元素及其定位策略 我们已经非 ...
- glib-2.60在win64,msys2下编译
前阵子,工作原因,需要在win7 64下的msys2来编译glib,下面是一些踩过的坑: 事先声明一下,这些个解决方式及纯粹是为了编译通过,可能有些做法不太适合一些需要正常使用的场合,烦请各位注意下. ...
- git 合并分支 merge
git 分支开发 git 分支开发,分支(feature)同步主干(master)代码,以及最终分支合并到主干的操作流程 由于 rebase 执行速度慢,分支同步主干代码时,分支的每次提交都可能和 ...
- Linux重启php-fpm
前言 PHP-FPM 是一款简单好用的 PHP FastCGI 进程管理工具. 它可以和 Apache.Nginx 或其他服务器一起构建完整的 PHP 环境. 接下来我们看看在更改了 php.ini ...
- [每日算法] leetcode第1题:两数之和
leetcode第1题入口 知识点 寻找循环体中目标值之间的关系来减少循环层数 (利用关系建立查找对方的数据结构来空间换时间) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请 ...
- 【Linux】5.1 Shell简介
Shell简介 1. Shell基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这 ...