在线程中执行类成员变量

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

相关文章

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

MySQL使用binlog2sql工具实现在线恢复数据功能

《MySQL使用binlog2sql工具实现在线恢复数据功能》binlog2sql是大众点评开源的一款用于解析MySQLbinlog的工具,根据不同选项,可以得到原始SQL、回滚SQL等,下面我们就来... 目录背景目标步骤准备工作恢复数据结果验证结论背景生产数据库执行 SQL 脚本,一般会经过正规的审批

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

Perl 特殊变量详解

《Perl特殊变量详解》Perl语言中包含了许多特殊变量,这些变量在Perl程序的执行过程中扮演着重要的角色,:本文主要介绍Perl特殊变量,需要的朋友可以参考下... perl 特殊变量Perl 语言中包含了许多特殊变量,这些变量在 Perl 程序的执行过程中扮演着重要的角色。特殊变量通常用于存储程序的