把C++类成员方法直接作为线程回调函数
来源:互联网 发布:vb.net 源码 编辑:程序博客网 时间:2024/05/21 06:39
我以前写线程时要么老老实实照着声明写,要么使用C++类的静态成员函数来作为回调函数,经常会因为线程代码而破坏封装.之前虽然知道类成员函数的展开形式,但从没想过利用过它,昨天看深入ATL时无意中学会了这一招:)
类成员方法是一个比较特殊的函数,它在编译时会被转化成普通函数,比如有TMyClass类:
class TMyClass{
void Func();
};
这个TMyClass::Func最终会转化成 void Func(TMyClass *this); 也就是说在原第一个参数前插入指向对象本身的this指针。
我们可以利用这个特性写一个非静态类成员方法来直接作为线程回调函数,先看_beginthread函数的定义:
unsigned long _RTLENTRY _EXPFUNC _beginthread (void (_USERENTRY *__start)(void *),unsigned __stksize, void *__arg);
其中的第一个参数就是作为线程执行主体的回调函数。它的原型是:void Func(void *),这个void*参数是作为自定义数据传入的。对比一下上面所说的TMyClass::Func的最终形式,它正好可以符合这里的要求。
现在做个实验:
#include <stdio.h>#include <process.h>class TMyClass{ int m_nCount; int m_nId;public: TMyClass(int nId,int nCount) :m_nId(nId),m_nCount(nCount) { } void _USERENTRY ThreadProc() // 类成员方法 { for(int i=0; i<m_nCount; i++) // 根据m_nCount成员打印一排数字 { printf("Class%d : %d/n",m_nId,i); } }};int main(int argc, char* argv[]){ union { // 联合类,用于转换类成员方法指针到普通函数指针(试过编译器不允许在这两种函数之间强制转换),不知道有没有更好的方法。 void (_USERENTRY *ThreadProc)(void *); void (_USERENTRY TMyClass::*MemberProc)(); } Proc; // 尽管联合里的两种函数类型现在看起来有很大不同,但它们的最终形式是相同的。 TMyClass MyClass1(1,10),MyClass2(2,5); // 产生两个TMyClass对象 Proc.MemberProc = &TMyClass::ThreadProc; // 转换,Proc.ThreadProc就是对应的普通函数指针了 _beginthread(Proc.ThreadProc,4096,&MyClass1); // 开始线程,这里的Proc.ThreadProc实际上是TMyClass::ThreadProc, 它要的this指针是我们给的&MyClass1。 _beginthread(Proc.ThreadProc,4096,&MyClass2); system("pause"); return 0;}
运行!神奇吧?:-)
其实不止线程回调函数,其实只要是形如Func(void*,...)的回调函数都可以用这种方法直接使用类成员方法。(前提是第一个void*是自定义数据,也就是说它不能有其它功能)。
0 1
- 把C++类成员方法直接作为线程回调函数
- 把C++类成员方法直接作为线程回调函数[转]
- 把C++类成员方法直接作为线程回调函数
- 把C++类成员方法直接作为线程回调函数
- 把C++类成员方法直接作为线程回调函数
- 把C++类成员方法直接作为线程回调函数
- 把C++类成员方法直接作为线程回调函数
- 把C++类成员方法直接作为线程回调函数
- 把C++类成员方法直接作为线程回调函数
- 把C++类成员方法直接作为线程回调函数
- 把C++的类的方法直接作为线程的回调函数
- C++类成员函数作为线程回调函数
- 类的成员函数作为回调函数的方法
- 类成员函数作为回调函数
- 类成员函数作为回调函数
- C++线程回调函数调用类成员函数方法
- C++中 线程函数为静态函数 及 类成员函数作为回调函数
- C++中类成员函数作为回调函数的几种方法
- mysql计算两个datetime的差
- [android开发]Animation动画的实现
- 如何计算代码的运行性能
- 新一代 Linux 文件系统 btrfs 简介
- 黑马程序员——JAVA基础------进程和线程
- 把C++类成员方法直接作为线程回调函数
- Java IO流
- AngularJS学习笔记(一)
- 19岁少年重塑CPU,降低80%计算机功耗
- pip安装使用详解
- 链表系列
- oracle登录错误(ORA-01033:ORACLE initialization or shutdown in progress
- Java Heap sapce 与 Java PermGen space
- hdoj 1814 Peaceful Commission 【2-sat暴力染色 求解字典序最小解】