【经验】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 ...
随机推荐
- Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]
Count Arrays:一眼秒的计数题. 思路 显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是 \(1\),就会形成一个基环树森林. 那么考虑这个环上能填什么数.因为所有数都小于等于 ...
- bash 学习
学习bash shell 第一天 在百度百科上找的解释 Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写.1989年发布第一个正式版本,原先是计划用在GNU操作系 ...
- Vue3 基础概念与环境搭建
前言 首先需要提醒大家的是,Vue2 已经在2023年停止维护,为了能更好地适应前端开发的发展趋势以及获得更好的性能和功能,我们将从这篇文章开始进入Vue3的阶段.如果对Vue2有想了解的小伙伴可以自 ...
- C++最基本调用静态库的方法小结
同样是最基本的调用方法小例,希望能带来参考,感谢! 创建静态库 编辑头文件 myLib.h: #pragma once #include "stdafx.h" int add(in ...
- 仿京东短信验证码UI效果(鸿蒙)
整体思路: 外层Stack布局,里面TextInput组件用来调起键盘,Row布局中循环出四个Text组件,Row布局覆盖在TextInput组件上,用来展示输入的数字. 定义两个参数,code用来接 ...
- ubuntu20.04使用EasyConnect
起因:BUAA校外访问内网vpn的客户端 用的学校vpn内下载的deb包EasyConnect_x64_7_6_7_3.deb,就直接sudo apt install安装了,之后应用的目录在/usr/ ...
- Web前端入门第 8 问:HTML <!DOCTYPE> 申明有何用处?如果没有此申明有什么问题?
HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 先电脑端浏览器打开任何一个网页,比如百度. 再用 ctrl + u 快捷键即可查看源码,瞅瞅第一行代码,是不是都 ...
- react使用插件配置px转换为rem
react使用插件postcss-pxtorem配置px自动转换rem 1.下载postcss-pxtorem插件 npm install postcss postcss-pxtorem --save ...
- 认识webRTC
什么是 WebRTC 2010 年 5 月,谷歌收购了 Global IP Solutions(简称 GIPS),这是一家专注于 VoIP 和视频会议软件的公司,已开发出 RTC 所需的多项关键组件, ...
- Ubuntu给Appimage创建快捷方式
下载 AppImageLauncher 2.安装 3.选择要运行的Appimage 双击运行即可.他会在home目录下创建一个applications文件夹,并且帮你自动创建快捷方式.