其他分享
首页 > 其他分享> > c – 创建非静态成员函数的线程?

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