这和成员函数调用有关 , 比如 void A::b() 可以理解为
b(A) 就是成员函数的第一个参数是 类的实体指针 这样就和线程函数的类型 不一样调用的时候会出问题 , 具体点线程函数的参数传递是压栈的, 类成员函数调用要把类变量地址通过ecx传递过去,然后压栈
static成员函数只能调用静态的或者全全局的;
举例说明:
类中声明线程函数
class Cxxx : public CDialog
{
static UINT Doxxx(LPVOID pParam);
}
创建线程
AfxBeginThread(DoDBServer,this);\\传入this指针
线程函数体:
UINT Cxxx::Doxxx(LPVOID pParam)
{
Cxxx p=(Cxxx)pParam;
使用指针调用类成员即可。
}
用对象调用, 或者说该怎么调用就怎么调用, 跟线程没关系
不过你这个写法是有问题的。 除非你的 ThreadRun函数是个static函数,否则它有个隐形的第一参数, 结果这个函数的声明跟api的要求对不上了
做个转换,定义两个相个函数:static DWORD WINAPI FuncA(LPVOID p)和DWORD FuncB()
DWORD CXXXDlg::FuncA(LPVOID p)
{
CXXXDlg pPara=(CXXXDlg)p;
return pPara->FuncB();
}
//真正的线程函数
DWORD CXXXDlg::FuncB()
{
AfxMessageBox(_T(""));
return 0;
}
CreateThread(NULL,0,FuncA,this,0,NULL);
类的静态成员函数本来就是类方法,和实例无关,所以引用aa和bb会出错,编译也过不了啊
mfun虽然是普通成员函数(类的实例方法),但是调用的时候实际上会有一个this指针作为参数,所以在线程中调用的函数原型实际上是void mFunc(C thisPointer),你起线程的时候除了传入函数地址外,还要把this指针作为参数传入
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)