MFC线程-AfxBeginThread使用方法

前言

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;

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

交换机配置从IP(Switch Configuration from IP)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

【Redis】基于Redis实现秒杀功能

业务的流程大概就是,先判断优惠卷是否过期,然后判断是否有库存,最好进行扣减库存,加入全局唯一id,然后生成订单。 一、超卖问题 真是的场景下可能会有超卖问题,比如开200个线程进行抢购,抢100个…

STL——vector(1)

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

【东莞石碣】戴尔R740服务器维修raid硬盘问题

1:石碣某塑料工厂下午报修一台戴尔R740服务器硬盘故障,催的还比较着急。 2:工程师经过跟用户确认故障的问题以及故障服务器型号和故障硬盘型号,产品和配件确认好后,公司仓库确认有该款硬盘现货,DELL 12T S…

使用 .NET 创建新的 WPF 应用

本教程介绍如何使用 Visual Studio 创建新的 Windows Presentation Foundation (WPF) 应用。 使用 Visual Studio,可以向窗口添加控件以设计应用的 UI,并处理这些控件中的输入事件以与用户交互。 在本教程结束时,你有一…

Shell基础(5)

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团…

嵌入式:STM32的启动(Startup)文件解析

相关阅读 嵌入式https://blog.csdn.net/weixin_45791458/category_12768532.html?spm1001.2014.3001.5482 启动文件(Startup File)是嵌入式系统开发中的核心组件之一,它用于初始化系统并为主程序的运行做好准备。在大多数情况下,启动文件是用汇编语言编…

CH03_反射

第3章:反射 本章目标 掌握反射的原理 熟悉反射的基本运用 本章内容 反射是什么 C# 编译运行过程 首先我们在VS点击编译的时候,就会将C#源代码编译成程序集 程序集以可执行文件 (.exe) 或动态链接库文件 (.dll) 的形式实现 程序集中包含有Microsoft …

HAL_UARTEx_ReceiveToIdle_DMA和HAL_UART_Receive_DMA的区别

功能 HAL_UART_Receive_DMA 仅仅是开启的串口的DMA接收,若是想使用空闲中断 DMA接收则需要开启串口的空闲中断; 而HAL_UARTEx_ReceiveToIdle_DMA函数中则包含了开启串口空闲中断; HAL_UART_Receive_DMA 的接收类型是HAL_UART_RECEPTION_ST…

MyBlog(三) -- APP的应用

文章目录 前言一、APP是什么?二、创建APP三、使用APP1. 注册app2. 添加路由3. 运行过程4. 完善视图函数5. 结果展示 总结 前言 前面我们已经学习了如何创建一个新的项目,并且配置好了项目的启动文件,成功将项目启动! 那么接下来我们的主要任务就是需要完善这个项目中应该包含…

tdengine学习笔记-整体架构及docker安装

官方文档:用 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据 整体架构 TDENGINE是分布式,高可靠,支持水平扩展的架构设计 TDengine分布式架构的逻辑结构图如下 一个完整的 TDengine 系统是运行在一到多个物理节点上的,包含…

【支持向量机(SVM)】:相关概念及API使用

文章目录 1 SVM相关概念1.1 SVM引入1.1.1 SVM思想1.1.2 SVM分类1.1.3 线性可分、线性和非线性的区分 1.2 SVM概念1.3 支持向量概念1.4 软间隔和硬间隔1.5 惩罚系数C1.6 核函数 2 SVM API使用2.1 LinearSVC API 说明2.2 鸢尾花数据集案例2.3 惩罚参数C的影响 1 SVM相关概念 1.1…

git 基础之 merge 和 rebase 的比较

在团队软件开发过程中,代码合并是一个基本且频繁执行的任务。 Git 提供了多种合并代码的策略,其中最常用的是 merge 和 rebase。 尽管二者的终极目标是相同的——整合代码变更——它们的方法和推荐的使用场景却有所区别。本文将详细介绍和比较这两种策…

sagemaker中使用pytorch框架的DLC训练和部署cifar图像分类任务

参考资料 https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-python-sdk/pytorch_cnn_cifar10/pytorch_local_mode_cifar10.ipynbhttps://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html 获取训练数据 # s3://zhaojiew-sa…

jmeter常用配置元件介绍总结之配置元件

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

vite+vue3+ts编译vue组件后,编译产物中d.ts文件为空

一、前言 使用vue3vitets实现一个UI组件库,为了生成类型文件便于其他项目引用该组件库。根据推荐使用了vite-plugin-dts插件进行ts文件的生成 二、版本 组件版本vue ^3.5.12 vite ^5.4.10 vite-plugin-dts ^4.3.0 typescript ~5.6.2 三、问题描述 使用vitevi…

红外相机和RGB相机外参标定 - 无需标定板方案

1. 动机 在之前的文章中红外相机和RGB相机标定:实现两种模态数据融合_红外相机标定-CSDN博客 ,介绍了如何利用标定板实现外参标定;但实测下来发现2个问题: (1)红外标定板尺寸问题,由于标定板小…

柔性仿人手指全覆盖磁皮肤,具备接触觉和运动觉的双模态感知能力

人体精细触觉和本体运动觉依赖于相同类型的感受器,这些感受器位于肌肉、肌腱、关节和皮肤中,负责感知轻触、挠痒、细微压力、形状变化、肌肉张力、肌腱拉伸和关节位置变化等信息。因此方斌教授团队着手于具有高精度、小尺寸、可定制等优势的磁触觉传感器…

【摘要】正点原子--Makefile--学习笔记

目录 一、Makefile 基础1、Makefile引入2、Makefile初次编写 二、Makefile语法1、Makefile规则格式2、Makefile第一次升级 一、Makefile 基础 1、Makefile引入 2、Makefile初次编写 二、Makefile语法 1、Makefile规则格式 2、Makefile第一次升级

【WPF】Prism学习(八)

Prism Dependency Injection 1.处理解析错误 1.1. 处理解析错误: 这个特性是在Prism 8中引入的,如果你的应用目标是早期版本,则不适用。 1.2. 异常发生的原因: 开发者可能会遇到多种原因导致的异常,常见的错误包括…