CALLBACK函数要声明称 static或全局,而在静态的函数中药调用非静态成员还不能调用,必须把这些成员也设置成静态的,不怎么方便,有好的解决方法吗。

其原因是把CALLBACK函数封装成C++类的非静态成员后,需要有建 立对象,再通过对象才能去找到这个成员函数。而系统调用这个CALLBACK函数的时候,才不管你有没有建立对象呢。典型的解决方法是需要用静态成员函数 给系统CALL。然后设法把THIS指针传给这个STATIC函数,让这个STATIC函数通过THIS指针访问到当前对象里的成员函数,那么这个成员函 数就可以轻松操作所有成员变量了。这种方法适用于所有系统CALLBACK。

以CreateThread为例,

class CTest
{
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函数和线程函数中《转载》相关推荐

  1. pthread_create函数的详细讲解(包括向线程函数传递参数详解)

    pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int pthread_create(pthread_t*restrict ...

  2. 【Linux 线程】常用线程函数复习《一》

    1.pthread_create以及pthread_self函数 1 /**************************************************************** ...

  3. 线程函数的设计以及MsgWaitForMultipleObjects函数的使用要点

    使用多线程技术可以显著地提高程序性能,本文就讲讲在程序中如何使用工作线程,以及工作线程与主线程通讯的问题. 一 创建线程 使用MFC提供的全局函数AfxBeginThread()即可创建一个工作线程. ...

  4. c++ 线程函数(类成员函数作为线程函数使用)

    C++类成员函数使用时,都会隐式传递一个this指针给该函数,this指针指向该类的对象.函数体可以通过显示调用该指针或直接访问类内成员. 回调函数是通过指针调用的函数,最常使用的回调函数就是在创建线 ...

  5. C/C++线程函数_beginthreand和_beginthreadex

    一.背景介绍 ★两套API :OS API vs CRT API 首先,Windows操作系统本身提供了线程的创建函数CreateThread 和销毁函数ExitThread .其中的CreateTh ...

  6. C++中 线程函数为静态函数 及 类成员函数作为回调函数(转载)

    C++中 线程函数为静态函数 及 类成员函数作为回调函数 线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运 ...

  7. 回调函数 相当于线程_Java中的回调机制,这篇给你整的明明白白的

    作者:带妳心菲 cnblogs.com/prayjourney/p/9667835.html 调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: ...

  8. c++学习笔记之基础---类内声明线程函数的调用

    近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数exec_task中调用pthread_create去启动线程执行例程thread_rounter.编译之后报错如下: spf ...

  9. mfc 创建线程函数AfxBeginThread,线程中访问mfc控件

    转字http://blog.csdn.net/guomsh/article/details/10377993 1. C++ 中如何定义线程函数 有两种方法:a. 定义线程函数为全局函数    b. 定 ...

  10. VC++中多线程学习(MFC多线程)一(线程的创建、线程函数如何调用类成员呢?如何调用主对话框的成员?、MFC中的工作线程和界面线程的区别)

    这里废话不多讲了,因为项目原因,需要开启线程进行处理,在不了解线程的情况下,直接百度一下,然后就使用了,结果可想而知,出现了异常,所以花了一天时间系统学习一下多线程,这里主要是针对win32编程方面的 ...

最新文章

  1. Jboss RestEasy构建简单的RESTful Web Services示例(1)
  2. C++ error LNK2019: 无法解析的外部符号 错误解决方案
  3. 渗透知识-XSS跨站脚本攻击
  4. Django 3.2.5博客开发教程:HelloWorld欢迎页面
  5. c#同类型操作最终得到的结果将是同类型
  6. js 通用 保留两位小数 金额千分位格式化
  7. 电脑公司最新稳定win7系统下载
  8. Android控件 TabHost,Android控件之TabHost用法实例分析
  9. 红蓝对抗——蓝军(CheckList)总结
  10. 移动接入资源发布技术
  11. 中国工商银行上海市分行-存量房交易服务平台
  12. 自学习策略和Lévy飞行的正弦余弦优化算法
  13. # GIT团队实战博客
  14. 宋体查询1.mysql数据库复习加强 2.mysql事务触发器 3.mysql 索引外键加强 4.zendstudio 的安装使用 5.svn版本控制器的使用-java教程...
  15. 補一篇用 Genero BDL 寫 hello world
  16. UVA, 10286 Trouble with a Pentagon
  17. Xilinx HLx 2017.1 与VS 2017兼容问题解决
  18. Selenium学习(十) selenium IDE命令之 verify系列详解
  19. VC++使用画刷绘图 简单画刷 FillRect函数 位图画刷 透明画刷
  20. canvas封闭图形填充与

热门文章

  1. DataSet的Join操作
  2. WindowManager添加一个悬浮的Window
  3. Centos7 安装X2goSever的步骤
  4. 如何利用webpack4.0搭建一个vue项目
  5. 4.数据库表的高级查询
  6. 如何固定电脑ip地址
  7. Go语言中的结构体 (struct)
  8. (转 )Unity对Lua的编辑器拓展
  9. Oracle 数据块损坏与恢复具体解释
  10. 高性能编程之IO复用之epoll