MFC中多线程问题

MFC中多线程问题

问题是这样的:我们编程涉及到一个多线程问题,当把线程函数定义为全局时正常,而定义为类的成员函数时就会出错。说错误是AfxBeginThread不能从unsinged int (void *)转换为第一个参数。我在google上搜索了一下,找到了几个解决方案。
1.定义一个可直接在线程里调用类成员函数的类,并且网上也给出了类的实现。但我没有去研究,因为觉得这样不太方便,增加一个类,就会增加出错的机会。

2.将线程定义为static的。因为类的成员函数在调用时会首先传递个this指针,第一个参数就是this了,这也是如上直接使用成员函数失败的原因。但是又出现了新的问题:在定义为static时不能调用非静态的成员变量。我想到的解决办法是在用AfxBeginThread启动线程时第二个参数传为this,即类的指针,再在线程函数里用这个指针来调用成员函数和变量。
cpp 代码
  1. 1. class CRealtimeTask
  2. 2. {
  3. 3. public:
  4. 4. static UINT taskmain(LPVOID param);
  5. 5. BOOL StartTask();
  6. 6. void dosomething(){...}
  7. 7. };
  8. 8.
  9. 9. UINT CRealtimeTask ::taskmain(LPVOID param)
  10. 10. {
  11. 11. CRealtimeTask * pTaskMain = (CRealtimeTask *) param;
  12. 12. //通过pTaskMain指针引用。
  13. 13. pTaskMain->dosomething();
  14. 14. return TRUE;
  15. 15. }
  16. 16.
  17. 17. BOOL CRealtimeTask::StartTask()
  18. 18. {
  19. 19. AfxBeginThread(taskmain,this);
  20. 20. }

3.将线程定义为类的友元,如下所示:
cpp 代码
  1. class CRealtimeTask
  2. {
  3. public:
  4. friend UINT taskmain(LPVOID param);
  5. BOOL StartTask();
  6. };
  7. UINT taskmain(LPVOID param)
  8. {
  9. CRealtimeTask * pTaskMain = (CRealtimeTask *) param;
  10. //通过pTaskMain指针引用。
  11. return TRUE;
  12. }
  13. BOOL CRealtimeTask::StartTask()
  14. {
  15. AfxBeginThread(taskmain,this);
  16. }
参考: http://blog.chinaunix.net/u/21158/showart_298882.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值