在线程中执行类成员变量

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

相关文章

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Python变量与数据类型全解析(最新整理)

《Python变量与数据类型全解析(最新整理)》文章介绍Python变量作为数据载体,命名需遵循字母数字下划线规则,不可数字开头,大小写敏感,避免关键字,本文给大家介绍Python变量与数据类型全解析... 目录1、变量变量命名规范python数据类型1、基本数据类型数值类型(Number):布尔类型(bo

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据