在线程中执行类成员变量

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

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

Smarty模板执行原理

为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开发者所认可。本文将记录一下smarty模板引擎的工作执行原理,算是加深一下理解。 其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者