在线程中执行类成员变量

2023-12-11 05:08

本文主要是介绍在线程中执行类成员变量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


   一般,线程都是全局函数,那要想在线程中使用类成员函数怎么办呢?

   解决途径是: 将类的指针作为参数 传递给线程函数。


  SearchProcess()是CMainFrame类成员函数

  SearchThread(LPVOID pParam)  线程函数


  CMainFrame::Fun()  --------  当调用此函数时,执行线程


方法一:  全局函数

void CMainFrame::Fun()
{AfxBeginThread(SearchThread,this);}


//全局函数 不能访问类的私有变量

UINT SearchThread(LPVOID pParam) //全局函数
{CMainFrame*   pMainFrm   =   (CMainFrame*)pParam;pMainFrm->SearchProcess();return 1;}


方法二: 静态成员函数

 static UINT SearchThread(LPVOID pParam);  //搜索线程


静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。

但此处,将对应指针传过来, 因此,可以通过指针调用其他成员

UINT CMainFrame::SearchThread(LPVOID pParam) //静态成员函数 
{CMainFrame*   pMainFrm   =   (CMainFrame*)pParam;pMainFrm->SearchProcess();return 1;}

void CMainFrame::Fun()
{<strong>AfxBeginThread</strong>(SearchThread,this);}

方法三: 友元函数


友元函数 可以访问类的私有数据等

    friend UINT SearchThread(LPVOID pParam);  //搜索线程
UINT SearchThread(LPVOID pParam) //友元函数 可以访问类的私有变量
{CMainFrame*   pMainFrm   =   (CMainFrame*)pParam;pMainFrm->SearchProcess();return 1;}

void CMainFrame::Fun()
{AfxBeginThread(SearchThread,this);}


   这三种方法 使用的函数类型不同, 但其中心思想都是一致的

   其策略为:  将类对象的指针传递到线程中, 通过此指针 调用类成员函数

  

   注意:  类成员函数SearchProcess()  不要出现求取其他视图中对象地址情况

                 而要将其,作为类变量,在初始化中赋值


    比如, 此函数如果用到其他视图,则要在初始化中为其它视图指针赋值,而不要在此函数中赋值


错误方式:

void CMainFrame::SearchProcess()
{CMyView * pMyView=(CMyView*)m_SplitterWnd.GetPane(0,1);  //此处赋值是错误的  ,而应在OnInitialUpdate 中为类变量赋值
}

正确方式:

void CMainFrame::OnInitialUpdate(void)
{pMyView=(CMyView*)m_SplitterWnd.GetPane(0,1);
}


 
四  传递多个参数


由于

AfxBeginThread(thread,pParm);
传递的参数只是一个指针,因此当传递多个参数时,可以设置一结构体保存各个参数

	struct ThreadPram{CMainFrame* pFram;CTreeCtrl * pCtrl;HTREEITEM hItem;}Param;Param.pFram=this;Param.pCtrl=pCtrl;Param.hItem=hItem;AfxBeginThread(PostThread,&Param);


 

//线程参数
struct ThreadPram
{CMainFrame* pFram;CTreeCtrl * pCtrl;HTREEITEM hItem;
};
//线程函数
UINT PostThread(LPVOID parm)
{ThreadPram *pThreadPram=(ThreadPram*)parm;CMainFrame *pMainFrm=pThreadPram->pFram;pMainFrm->TreeVisitPost (pThreadPram->pCtrl,pThreadPram->hItem);return 1;}


但是 ,在调试时发现,上述传参会有问题,原因是结构体变量是局部变量,退出此函数,进入线程函数执行时,结构体已经撤销,因此传递的值也就不正确了。

解决方法,将结构体声明为全局变量,也不传参了,直接用这个全局变量保存数据


//线程参数struct ThreadPram
{CMainFrame* pFram;CTreeCtrl * pCtrl;HTREEITEM hItem;};//全局结构体变量这样赋值时, 编译通过struct ThreadPram m_Param={NULL,NULL,NULL};//全局结构体变量 这样赋值时编译不通过 不知道为什么???
//  struct ThreadPram m_Param;
// 	m_Param.pFram=NULL;
// 	m_Param.pCtrl=NULL;
// 	m_Param.hItem=NULL;int m_threadStatus=1;
//线程函数
UINT PostThread(LPVOID parm)
{//	ThreadPram *pThreadPram=(ThreadPram*)parm;CMainFrame *pMainFrm=m_Param.pFram;pMainFrm->TreeVisitPost (m_Param.pCtrl,m_Param.hItem);m_threadStatus=1;return 1;}

//开始启动线程 遍历文章 进行发布
void CMainFrame::beginVisit(CTreeCtrl* pCtrl,HTREEITEM hItem)
{if(m_threadStatus)m_threadStatus=0;elsereturn;m_Param.pFram=this;m_Param.pCtrl=pCtrl;m_Param.hItem=hItem;AfxBeginThread(PostThread,NULL);}


这篇关于在线程中执行类成员变量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/479533

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理