MFC线程-AfxBeginThread使用方法

news2024/11/23 23:30:33

前言

AfxBeginThread 是 MFC(Microsoft Foundation Classes,微软基础类库)中用于创建一个新线程的函数。它返回一个指向 CWinThread 类对象的指针,通过这个指针可以对创建出来的线程进行后续的操作和控制。

CWinThread* AFXAPI AfxBeginThread(
    AFX_THREADPROC pfnThreadProc, LPVOID pParam,
	int nPriority = THREAD_PRIORITY_NORMAL, 
    UINT nStackSize = 0,
	DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

参数说明

该函数接收一个 LPVOID 类型(也就是 void* 类型,可用于传递任意类型的指针)的参数,这个参数就是在调用 AfxBeginThread 时通过 pParam 参数传递进来的值,函数返回一个 UINT 值,一般可以根据线程执行的结果返回相应的状态码等信息。例如,返回 0 表示线程正常结束,返回其他非零值可以表示不同的结束状态(具体含义由程序员自行定义)。

pfnThreadProc 参数:类型为 AFX_THREADPROC,这是一个函数指针类型。它指向的函数就是新线程要执行的线程函数。线程函数的定义形式通常类似如下:

UINT MyThreadProc(LPVOID pParam);

pParam 参数:类型为 LPVOID,它是传递给线程函数(也就是 pfnThreadProc 所指向的函数)的参数。你可以将需要在线程内部使用的数据的指针通过这个参数传递进去,比如传递一个结构体指针,该结构体中包含了线程执行任务所需要的各种配置信息等。

nPriority 参数:类型为 int,默认值是 THREAD_PRIORITY_NORMAL。用于设置新创建线程的优先级。线程优先级决定了线程在系统中获取 CPU 时间片的相对机会,取值可以是一些预定义的常量,例如:
THREAD_PRIORITY_HIGHEST:最高优先级,线程有较高的机会获取 CPU 时间片来执行。
THREAD_PRIORITY_ABOVE_NORMAL:高于正常优先级,能比正常优先级的线程更优先获取到 CPU 资源。
THREAD_PRIORITY_NORMAL:正常优先级,系统按照常规的调度策略分配 CPU 时间片。
THREAD_PRIORITY_BELOW_NORMAL:低于正常优先级。
THREAD_PRIORITY_LOWEST:表示最低优先级,线程相对较难获取到 CPU 时间片,执行机会相对较少。
 
nStackSize 参数:类型为 UINT,默认值是 0。它指定了新线程的栈空间大小(以字节为单位)。如果设置为 0,系统会使用默认的栈大小来为线程分配栈空间。通常情况下,默认值就可以满足大多数需求,但在一些特殊场景下,比如线程中可能会有很深的函数调用层次或者大量的局部变量等情况,可能需要手动指定一个较大的栈空间大小。
dwCreateFlags 参数:类型为 DWORD,默认值是 0。用于指定线程的创建标志,常见的取值有:
CREATE_SUSPENDED:如果设置了这个标志,线程创建后会处于挂起状态,需要通过调用 CWinThread 对象的 ResumeThread 方法来启动线程,使其开始执行。
0:表示线程创建后立即开始执行。
lpSecurityAttrs 参数:类型为 LPSECURITY_ATTRIBUTES,默认值是 NULL。它用于设置线程的安全属性,比如指定线程的安全描述符等信息。在大多数普通应用场景中,传递 NULL 即可,使用系统默认的安全设置。

案例:

新建一个基于对话框的窗体,添加一个button控件(IDC_BUTTON_Thread1)和Edit控件(IDC_EDIT_ThreadParm1)。为Edit控件添加一个变量m_thread1Pam;

头文件:

	CString m_thread1Pam;
	int num = 0;
	afx_msg void OnBnClickedButtonThread1();
    //千万要注意线程函数是静态类函数成员
	static UINT _cdecl pfnThreadProc(LPVOID lpararm);

CPP文件:

void CMFCThreadDlg::OnBnClickedButtonThread1()
{
	// TODO: 在此添加控件通知处理程序代码

	GetDlgItem(IDC_EDIT_ThreadParm1)->GetWindowText(m_thread1Pam);
	num=_ttoi(m_thread1Pam);
	GetDlgItem(IDC_EDIT_ThreadParm1)->SetWindowText(TEXT(""));
	CWinThread* pThread = AfxBeginThread(pfnThreadProc, this);

	if (pThread != NULL)
	{
		// 获取线程句柄,用于WaitForSingleObject函数
		HANDLE hThread = pThread->m_hThread;
		// 等待线程结束,获取线程的返回值
		DWORD waitResult = WaitForSingleObject(hThread, INFINITE);

		if (waitResult == WAIT_OBJECT_0)
		{
			AfxMessageBox(TEXT("线程正常退出"));
		}
	}
	else
	{
		AfxMessageBox(TEXT("线程创建失败"));
	}
}

//注意函数成员需要添加类CMFCThreadDlg::类头,不然会报LNK2019错误
UINT _cdecl CMFCThreadDlg::pfnThreadProc(LPVOID pParam)
{

	CMFCThreadDlg* p = (CMFCThreadDlg*)pParam;
	int a = p->num;
	CString str;
	str.Format(_T("输入数据:%d \n"), a);
	TRACE(str);
	return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大语言模型---ReLU函数的计算过程及其函数介绍

文章目录 1. 概要2. ReLU定义 1. 概要 **ReLU 作用:**主要用于为神经网络引入非线性能力,作用是将输入中的整数保留原值,负数置为 0。 从而在层与层之间引入非线性,使神经网络能够拟合复杂的非线性关系。 **ReLU使用场景&#xf…

QT如何共享文件+拷贝文件

QString sharedFolderPathImg "\\\\" IP "/profileImage/"; // 更换为你的共享文件夹路径QDir dirImg(sharedFolderPathImg);dirImg.setFilter(QDir::NoDotAndDotDot | QDir::AllEntries);QVector<QString> curFileEntryArrayImg dirImg.entryList…

sourceTree无效的源路径问题解决

1.点击工具 2.点击选项 3.修改ssh客户端为OpenSSH 4.点击确定&#xff0c;然后重新打开软件

智慧营区整体解决方案

智慧军营概述智慧军营以信息化平台为基础&#xff0c;整合物联网、大数据、云计算、AI智能等技术&#xff0c;构建集人员、车辆、安防管理于一体的物联网平台。通过信息技术和网络技术&#xff0c;提高管理可控性&#xff0c;减少管理流程&#xff0c;降低成本&#xff0c;实现…

node实战:创建第一个简单的应用项目

1、确保node已安装 node -vnpm -v 2、创建项目文件夹 mkdir first-node-app-demo 3、初始化项目 3.1 执行&#xff08;输入&#xff09;命令 cd first-node-app-demo npm init -y 3.2 控制台输出 3.3 查看项目中的package.json文件 3.4 修改package.json文件 {"name…

STL——vector(1)

博客ID&#xff1a;LanFuRenC系列专栏&#xff1a;C语言重点部分 C语言注意点 C基础 Linux 数据结构 C注意点 今日好题 声明等级&#xff1a;黑色->蓝色->红色 欢迎新粉加入&#xff0c;会一直努力提供更优质的编程博客&#xff0c;希望大家三连支持一下啦 目录 尾…

pycharm在使用conda虚拟环境时Terminal爆红问题

问题&#xff1a; 解决方法&#xff1a; 复制cmd.exe后面所有路径 添加到pycharm的shell path中&#xff1a;

嵌入式LVGL自定义纯数字键盘

嵌入式LVGL自定义纯数字键盘 一、前言二、设置自定义数字键盘三、使用一、前言 嵌入式UI项目中有时候会使用到纯数字密码的需求,所以打算使用LVGL构建自定义的纯数字键盘。 二、设置自定义数字键盘 参考这个文章,以LV_KEYBOARD_MODE_USER_1为例,增加一个数字键盘,如下图所…

太速科技-512-基于ZU19EG的4路100G 8路40G的光纤汇流计算卡

基于ZU19EG的4路100G 8路40G的光纤汇流计算卡 一、板卡概述 本板卡系我司自主设计研发&#xff0c;基于Xilinx公司Zynq UltraScale MPSOC系列SOC XCZU19EG-FFVC1760架构&#xff0c;ARM端搭载一组64-bit DDR4&#xff0c;总容量达4GB&#xff0c;可稳定运行在2400MT/s…

【java-Neo4j 5开发入门篇】-最新Java开发Neo4j

系列文章目录 前言 上一篇文章讲解了Neo4j的基本使用&#xff0c;本篇文章对Java操作Neo4j进行入门级别的阐述&#xff0c;方便读者快速上手对Neo4j的开发。 一、开发环境与代码 1.docker 部署Neo4j #这里使用docker部署Neo4j,需要镜像加速的需要自行配置 docker run --name…

时间请求参数、响应

&#xff08;7&#xff09;时间请求参数 1.默认格式转换 控制器 RequestMapping("/commonDate") ResponseBody public String commonDate(Date date){System.out.println("默认格式时间参数 date > "date);return "{module : commonDate}"; }…

华为防火墙技术基本概念学习笔记

1.防火墙概述 1.1防火墙与交换机、路由器对比 路由器与交换机的本质是转发&#xff0c;防火墙的本质是控制。 防火墙与路由器、交换机是有区别的。路由器用来连接不同的网络&#xff0c;通过路由协议保证互联互通&#xff0c;确保将报文转发到目的地;交换机则通常用来组建局域…

基于深度学习CNN算法的花卉分类识别系统01--带数据集-pyqt5UI界面-全套源码

文章目录 基于深度学习算法的花卉分类识别系统一、项目摘要二、项目运行效果三、项目文件介绍四、项目环境配置1、项目环境库2、环境配置视频教程 五、项目系统架构六、项目构建流程1、数据集2、算法网络Mobilenet3、网络模型训练4、训练好的模型预测5、UI界面设计-pyqt56、项目…

Java的方法、基本和引用数据类型

个人的黑马程序员java笔记 目录 方法 例&#xff1a;方法定义和调用 方法的重载 对于byte, short, int, long类型 方法的内存 基本数据类型 引用数据类型 方法的值的传递的内存原理 方法 方法&#xff08;method&#xff09;是程序中最小的执行单元格式 方法定义&a…

分层架构 IM 系统之架构演进

在电商业务日活几百万的情况下&#xff0c;IM 系统采用分层架构方式&#xff0c;如下图。 分层架构的 IM 系统&#xff0c;整体上包含了【终端层】、【入口层】、【业务逻辑层】、【路由层】、【数据访问层】和【存储层】&#xff0c;我们在上篇文章&#xff08;分层架构 IM 系…

【Docker】Docker介绍|部署|简单使用|镜像操作|容器操作|自动构建镜像

文章目录 DockerDocker介绍Docker简介Docker的主要特点为什么要使用Docker&#xff1f;Docker核心概念&#xff08;1&#xff09;镜像&#xff08;Image&#xff09;&#xff08;2&#xff09;容器&#xff08;Container&#xff09;&#xff08;3&#xff09;仓库&#xff08;…

LLM( Large Language Models)典型应用介绍 1 -ChatGPT Large language models

ChatGPT 是基于大型语言模型&#xff08;LLM&#xff09;的人工智能应用。 GPT 全称是Generative Pre-trained Transformer。-- 生成式预训练变换模型&#xff1a; Generative&#xff08;生成式&#xff09;&#xff1a;可以根据输入生成新的文本内容&#xff0c;例如回答问题…

PAL(Program-Aided Language Model)

PAL&#xff08;Program-Aided Language Model&#xff09;是一种结合生成式语言模型&#xff08;如 GPT&#xff09;和程序执行能力的技术框架。它的核心思想是通过让语言模型生成代码或程序来解决复杂任务&#xff0c;程序执行的结果反过来增强语言模型的输出准确性和逻辑性。…

Flutter:AnimatedSwitcher当子元素改变时,触发动画

AnimatedSwitcher中的子元素 由:CircularProgressIndicator() 改变为:Image.network(https://cdn.uviewui.com/uview/swiper/1.jpg) 则会触发动画class _MyHomePageState extends State<MyHomePage> {bool flag true;overrideWidget build(BuildContext context) {retur…

NUXT3学习日记四(路由中间件、导航守卫)

前言 在 Nuxt 3 中&#xff0c;中间件&#xff08;Middleware&#xff09;是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑&#xff0c;像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用&#xff0c;也可以只在特定页…