多线程程序的线程函数需要使用类的成员变量和成员函数时,通常通过定义线程函数为类的友元函数,然后才能像类自己的成员函数一样访问其成员变量和成员函数。这种方式非常的方便尤其相对于通过定义静态全局线程函数和定义类的静态成员线程函数的方法有很大的优点,它能够访问类所有的成员变量和成员函数。
这里有几点需要注意的是:
1.定义线程函数时,除了需要在类的里边声明为友元函数,也要在该声明头文件顶部再次声明该线程函数,同时具体地定义该线程函数时也要将其放置在定义类文件的顶部,也就是说除了将其定义为类的友元函数这一点有些特别之外实际上也是将其作为一个全局函数来对待的。
2.在使用MFC线程类的AfxBeginThread创建线程函数调用并非类的线程函数时,需要对其进行(AFX_THREADPROC)类型强制转换,不然会出现错误如下:
error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'void (__cdecl *)(void *)'。这一点非常重要。
3. 线程函数之中调用类的成员变量和成员函数是通过创建线程时传入该类对象的this指针来引用的。在线程函数中获得该类对象的指针然后取得对应的成员变量和成员函数。
4. 另外在VC下调试时要注意其运行库必须设置为多线程并注意参数传入顺序。
下面给出一个示范例子:
ClassADlg.h //类头文件
void threadProc(LPVOID lpv);
///////////////////////////
class ClassADlg: public CDialog
{
Public:
friend void threadProc(LPVOID lpv);
}
ClassADlg.cpp //类实现文件
Include” ClassADlg.h”
////////////////////////
void threadProc(LPVOID lpv)
{
ClassADlg * pMain = (ClassADlg *) lpv; //强制转换获得传入的类对象指针
int a= pMain->ax; //获得传入的类对象的成员变量
pMain->add(a); //调用传入的类对象的成员函数
}
/////////////////////////////////////////////
Void test(void)
{
CWinThread* cWth1=AfxBeginThread((AFX_THREADPROC) threadProc,(LPVOID)this); //创建线程