c – 创建非静态成员函数的线程?
作者:互联网
参见英文答案 > C++ Thread in member function 2个
如果我有会员功能. . .
MyClass::MyFunction()
{
while(1)
{
//blah blah blah
}
}
. . .我尝试创建这个函数的线程. . .
CreateThread(Null, 0, (LPTHREAD_START_ROUTINE)MyFunction, NULL, 0, NULL);
. . .我总是得到一个错误,说(LPTREAD_START_ROUTINE)MyFunction是一个无效的类型转换,我无法创建非静态成员函数的线程.
我不能使我的函数静态,因为我多次使用this指针需要非静态成员函数来执行此操作.
有没有简单的方法来创建非静态成员函数的线程?
(我在Visual Studio 2010,C,MFC工作)
解决方法:
除了可能是“start()”函数之外,您应该对所有这些信息进行私有化.您将拥有类的私有静态成员函数作为操作系统的线程启动的目标,在“start()”中传递线程启动方法对象的“this”指针,将其强制转换为您的对象类型静态函数,然后在对象本身上调用您的私有主线程方法.由于静态函数是类的成员,因此它可以使用私有函数,而如果不是,则它不能(不是朋友).我没有编译/测试这个,但想法是:
class MyObj {
private:
void thread() {
// this-> is valid here
}
static DWORD static_entry(LPVOID* param) {
MyObj *myObj = (MyObj*)parm;
myObj->thread();
return 0;
}
public:
void start() {
CreateThread(Null, 0, (LPTHREAD_START_ROUTINE)static_entry, this, 0, NULL);
}
};
警告:在线程运行时不要销毁对象!您可能必须与互斥锁同步或确保线程在对象销毁时加入.如果start()的调用者不再管理对象,您还可以在thread()的末尾执行“删除此操作”或在static_entry结束时执行删除myObj.
标签:member-functions,c,multithreading,mfc 来源: https://codeday.me/bug/20190725/1535718.html