请教一下线程函数为什么不能做成员函数

请教一下线程函数为什么不能做成员函数,第1张

这和成员函数调用有关 , 比如 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指针作为参数传入

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12176588.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存