在C++类中定义线程函数的方法
来源:互联网 发布:斗鱼王师傅c语言视频 编辑:程序博客网 时间:2024/06/05 16:05
昨天用C++把我写的一个游戏功能进行了封装,其中涉及到一个小问题,就是我封装的C++类中必须定义2个线程函数,比如像下面这样:
1. class A
2. {
3. public:
4. A();
5. ~A();
6.
7. void XXX(void *p); //此函数为线程回调函数
8. };
其中XXX为线程回调函数,在另一个线程启动函数中需要用_beginthread()这个函数来调用的。但是当我在这么写时:
_beginthread(XXX, 0, NULL);
编译器报错误。。也就是无法编译通过。我仔细想了想,觉得确实也无法编译通过,因为线程函数在编译的时候必须知道函数入口地址才行,而我这么写,XXX的入口地址确实还是未知的。。
所以我想到了两种把未知变为已知的方法,一种是把XXX定义成静态成员函数,如下:
static void XXX(void *p);
另一种是把XXX定义成全局函数。
其实是一个道理,就是为了让_beginthread()知道这个函数的入口地址,全局函数和静态函数都存放在一个地方,在编译时都是已知的。
当我以为一切OK的时候,发现在XXX()函数中又报错了。。
说我使用了不在类域中的成员。其实就是这么个意思:
1. class A
2. {
3. public:
4. A();
5. ~A();
6.
7. static void XXX(void *p); //此函数为线程回调函数
8.
9. int a; //在XXX函数中会进行修改
10. };
其中A的成员变量a会在XXX()函数中进行修改,而在XXX函数中其实是看不到这个成员的。
你也许会问,怎么就看不到呢?我平时就是这么写的啊。比如我在A中定义的其他成员函数就可以直接访问这个a啊。
确实,在类A中其他的一般成员函数是可以访问这个成员变量a的。但是我们很容易忽略了一点,就是在一般成员函数中其实有一个隐藏的参数,就是指向这个类的this指针,我们在成员函数中访问成员变量a,其实是在访问this->a。所以我们的成员函数能够找到这个a,而我们的线程函数却没有传递这个参数,XXX()是用_beginthread()函数来创建的,所以如果我们要给XXX()传递参数,就必须写在_beginthread()的第三个参数中,可以看到我上面写的第三个参数是NULL,所以在XXX()中是无法访问成员变量a的,因为没有this指针。
明白这一点以后就非常容易了,在_beginthread()中把this指针传递给XXX()函数,然后在XXX()函数中把void*类型转换成类A的指针就可以了。如下:
1. class A
2. {
3. public:
4. A();
5. ~A();
6.
7. static void XXX(void *p); //此函数为线程回调函数
8. void start(); //线程启动函数
9. int a; //在XXX函数中会进行修改
10. };
11.
12. void start()
13. {
14. _beginthread(XXX, 0, this);
15. }
16.
17. void XXX(void *p)
18. {
19. A *handle = (A *)p;
20. int b = handle->a;
21. }
我是不是很牛。。。呵呵。好吧,我泛滥了。
- 在C++类中定义线程函数的方法
- 在C++类中定义线程函数的方法
- 在MFC中定义线程对应的线程执行函数
- C++:成员函数实现在类定义中与在类定义外的区别
- 在.c文件中调用c++定义的函数
- 在c语言中函数的定义与使用
- 在类中定义常量的方法
- C中在函数中定义函数(二)
- 【C/C++】三种在C++里定义比较函数的方法
- 接口中定义的方法在抽象类中实现
- c语言中函数变量定义是不是必须在函数的开始处?
- 关于“在C语言中只能在函数前面定义变量”的问题
- javascript 在 构造器函数中定义方法 vs 在 prototype 中定义方法
- 在UC脚本中不能调用AS3.0中定义的函数的方法
- [C#]调用字符串中定义的函数
- CUDA常见问题之无法在c文件中调用cu文件中定义的函数
- CUDA 问题解决 ——在 c 文件中调用 cu 文件中定义的函数失败
- C++ 类的成员函数定义在.h中为什么会产生函数重定义错误?
- hdu 1083 匈牙利算法
- SONObject jsonObject=JSONObject.fromObject(map) 执行到这的时候没有任何反应,并且不报错
- 项目2 职员也有工资了
- nandflash的地址周期
- Wifi+亚马逊购物工具,疑问云云
- 在C++类中定义线程函数的方法
- 匈牙利算法详解
- 张艺谋《归来》 陈道明助阵
- C++pair容器
- 八皇后
- 四六级最新翻译
- 共享模式词汇的威力
- 怎样才算有品位
- 一双鞋子看人生