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

你可能感兴趣的:(多线程,编程,.net,Google,mfc)