MFC中多线程问题
问题是这样的:我们编程涉及到一个多线程问题,当把线程函数定义为全局时正常,而定义为类的成员函数时就会出错。说错误是AfxBeginThread不能从unsinged int (void *)转换为第一个参数。我在google上搜索了一下,找到了几个解决方案。
1.定义一个可直接在线程里调用类成员函数的类,并且网上也给出了类的实现。但我没有去研究,因为觉得这样不太方便,增加一个类,就会增加出错的机会。
2.将线程定义为static的。因为类的成员函数在调用时会首先传递个this指针,第一个参数就是this了,这也是如上直接使用成员函数失败的原因。但是又出现了新的问题:在定义为static时不能调用非静态的成员变量。我想到的解决办法是在用AfxBeginThread启动线程时第二个参数传为this,即类的指针,再在线程函数里用这个指针来调用成员函数和变量。
3.将线程定义为类的友元,如下所示:
参考:
http://blog.chinaunix.net/u/21158/showart_298882.html
问题是这样的:我们编程涉及到一个多线程问题,当把线程函数定义为全局时正常,而定义为类的成员函数时就会出错。说错误是AfxBeginThread不能从unsinged int (void *)转换为第一个参数。我在google上搜索了一下,找到了几个解决方案。
1.定义一个可直接在线程里调用类成员函数的类,并且网上也给出了类的实现。但我没有去研究,因为觉得这样不太方便,增加一个类,就会增加出错的机会。
2.将线程定义为static的。因为类的成员函数在调用时会首先传递个this指针,第一个参数就是this了,这也是如上直接使用成员函数失败的原因。但是又出现了新的问题:在定义为static时不能调用非静态的成员变量。我想到的解决办法是在用AfxBeginThread启动线程时第二个参数传为this,即类的指针,再在线程函数里用这个指针来调用成员函数和变量。
cpp 代码
- 1. class CRealtimeTask
- 2. {
- 3. public:
- 4. static UINT taskmain(LPVOID param);
- 5. BOOL StartTask();
- 6. void dosomething(){...}
- 7. };
- 8.
- 9. UINT CRealtimeTask ::taskmain(LPVOID param)
- 10. {
- 11. CRealtimeTask * pTaskMain = (CRealtimeTask *) param;
- 12. //通过pTaskMain指针引用。
- 13. pTaskMain->dosomething();
- 14. return TRUE;
- 15. }
- 16.
- 17. BOOL CRealtimeTask::StartTask()
- 18. {
- 19. AfxBeginThread(taskmain,this);
- 20. }
3.将线程定义为类的友元,如下所示:
cpp 代码
- class CRealtimeTask
- {
- public:
- friend UINT taskmain(LPVOID param);
- BOOL StartTask();
- };
- UINT taskmain(LPVOID param)
- {
- CRealtimeTask * pTaskMain = (CRealtimeTask *) param;
- //通过pTaskMain指针引用。
- return TRUE;
- }
- BOOL CRealtimeTask::StartTask()
- {
- AfxBeginThread(taskmain,this);
- }