静态成员函数运用在CALLBACK函数和线程函数中《转载》
CALLBACK函数要声明称 static或全局,而在静态的函数中药调用非静态成员还不能调用,必须把这些成员也设置成静态的,不怎么方便,有好的解决方法吗。
其原因是把CALLBACK函数封装成C++类的非静态成员后,需要有建 立对象,再通过对象才能去找到这个成员函数。而系统调用这个CALLBACK函数的时候,才不管你有没有建立对象呢。典型的解决方法是需要用静态成员函数 给系统CALL。然后设法把THIS指针传给这个STATIC函数,让这个STATIC函数通过THIS指针访问到当前对象里的成员函数,那么这个成员函 数就可以轻松操作所有成员变量了。这种方法适用于所有系统CALLBACK。
以CreateThread为例,
{
public:
CTest();
~CTest();
static DWORD WINAPI ThreadCallback(PVOID pParam); //这个是系统要的东东,没有对象也能直接访问STATIC成员函数
DWORD MyProc();
private:
HANDLE m_hThread;
};
CTest::CTest()
:m_hThread(NULL)
{
m_hThread = CreateThread(NULL, 0, ThreadCallback, (LPVOID)this, 0, NULL); //注意把THIS指针当做PARAM传进去,没这个我们就不用玩了
ASSERT(m_hThread);
}
CTest::~CTest()
{
if(m_hThread)
{
TerminateThread(m_hThread, 1);
m_hThread = NULL;
}
}
static DWORD WINAPI CTest::ThreadCallback(PVOID pParam)//Callback函数可以声明成ThreadCallback(CTest* pCTest),而作为线程的函数参数必须声明成(PVOID pParam)。
{
((CTest*)pParam)->ThreadProc(); //把pParam还原成指向当前对象的指针,然后曲线救国一下
}
DWORD CTest::MyProc() //这个就是对象里的东西了,在里面可以为所欲为
{
//do whatever you want
//even visit the private member
}
如果在ThreadCallback函数里拿到this指针后,通过this指针去访问对象里的东西也是可以的,就不需要多一个 MyProc函数了。但是MyProc可以直接引用所有成员变量,而ThreadCallback里每次都得用this->xxxx访问,多一次地 址跳转,在效率上会比MyProc里直接调用稍低一些。所以还是推荐用上面代码的实现方式
转载于:https://www.cnblogs.com/kanego/articles/2268723.html
静态成员函数运用在CALLBACK函数和线程函数中《转载》相关推荐
- pthread_create函数的详细讲解(包括向线程函数传递参数详解)
pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int pthread_create(pthread_t*restrict ...
- 【Linux 线程】常用线程函数复习《一》
1.pthread_create以及pthread_self函数 1 /**************************************************************** ...
- 线程函数的设计以及MsgWaitForMultipleObjects函数的使用要点
使用多线程技术可以显著地提高程序性能,本文就讲讲在程序中如何使用工作线程,以及工作线程与主线程通讯的问题. 一 创建线程 使用MFC提供的全局函数AfxBeginThread()即可创建一个工作线程. ...
- c++ 线程函数(类成员函数作为线程函数使用)
C++类成员函数使用时,都会隐式传递一个this指针给该函数,this指针指向该类的对象.函数体可以通过显示调用该指针或直接访问类内成员. 回调函数是通过指针调用的函数,最常使用的回调函数就是在创建线 ...
- C/C++线程函数_beginthreand和_beginthreadex
一.背景介绍 ★两套API :OS API vs CRT API 首先,Windows操作系统本身提供了线程的创建函数CreateThread 和销毁函数ExitThread .其中的CreateTh ...
- C++中 线程函数为静态函数 及 类成员函数作为回调函数(转载)
C++中 线程函数为静态函数 及 类成员函数作为回调函数 线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运 ...
- 回调函数 相当于线程_Java中的回调机制,这篇给你整的明明白白的
作者:带妳心菲 cnblogs.com/prayjourney/p/9667835.html 调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: ...
- c++学习笔记之基础---类内声明线程函数的调用
近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数exec_task中调用pthread_create去启动线程执行例程thread_rounter.编译之后报错如下: spf ...
- mfc 创建线程函数AfxBeginThread,线程中访问mfc控件
转字http://blog.csdn.net/guomsh/article/details/10377993 1. C++ 中如何定义线程函数 有两种方法:a. 定义线程函数为全局函数 b. 定 ...
- VC++中多线程学习(MFC多线程)一(线程的创建、线程函数如何调用类成员呢?如何调用主对话框的成员?、MFC中的工作线程和界面线程的区别)
这里废话不多讲了,因为项目原因,需要开启线程进行处理,在不了解线程的情况下,直接百度一下,然后就使用了,结果可想而知,出现了异常,所以花了一天时间系统学习一下多线程,这里主要是针对win32编程方面的 ...
最新文章
- Jboss RestEasy构建简单的RESTful Web Services示例(1)
- C++ error LNK2019: 无法解析的外部符号 错误解决方案
- 渗透知识-XSS跨站脚本攻击
- Django 3.2.5博客开发教程:HelloWorld欢迎页面
- c#同类型操作最终得到的结果将是同类型
- js 通用 保留两位小数 金额千分位格式化
- 电脑公司最新稳定win7系统下载
- Android控件 TabHost,Android控件之TabHost用法实例分析
- 红蓝对抗——蓝军(CheckList)总结
- 移动接入资源发布技术
- 中国工商银行上海市分行-存量房交易服务平台
- 自学习策略和Lévy飞行的正弦余弦优化算法
- # GIT团队实战博客
- 宋体查询1.mysql数据库复习加强 2.mysql事务触发器 3.mysql 索引外键加强 4.zendstudio 的安装使用 5.svn版本控制器的使用-java教程...
- 補一篇用 Genero BDL 寫 hello world
- UVA, 10286 Trouble with a Pentagon
- Xilinx HLx 2017.1 与VS 2017兼容问题解决
- Selenium学习(十) selenium IDE命令之 verify系列详解
- VC++使用画刷绘图 简单画刷 FillRect函数 位图画刷 透明画刷
- canvas封闭图形填充与