当前位置: 动力学知识库 > 问答 > 编程问答 >

multithreading - run threads of class member function in c++

问题描述:

As the title says.

The following is my code skeleton.

class CLASS

{

public:

void A();

private:

DWORD WINAPI B(LPVOID);

};

void CLASS::A()

{

DWORD (WINAPI CLASS::*thread)(LPVOID) = &CLASS::B;

...

CreateThread(NULL, 0, thread, &arg, 0, NULL);

...

}

the function B needs CLASS's member variables.

But I've got an error code when I compiled this.

It's " can't convert argument 3 from 'DWORD (__stdcall CLASS::* )(LPVOID)' to 'LPTHREAD_START_ROUTINE' " or something like that.

I don't know if it is the same in the english environment.

can anybody help please?

网友答案:

Seriously, use std::thread (or boost::thread if your compiler doesn't support it yet):

class CLASS
{
public:
    void A();
private:
    void B(your args go here);
};

void CLASS::A()
{
    boost::thread(&CLASS::B, this, your args go here);
}
网友答案:

You've to define your callback function as static function if it's member function!


Better design : define a reusable class!

From my previous answer: (with little modification)

Even better would be to define a reusable class with pure virtual function run() to be implemented by the derived thread classes. Here is how it should be designed:

//runnable is reusable class. All thread classes must derive from it! 
class runnable
{
public:
    virtual ~runnable() {}
    static DWORD WINAPI run_thread(LPVOID args)
    {
        runnable *prunnable = static_cast<runnable*>(args);
        return prunnable->run();
    }
 protected:
    virtual DWORD run() = 0; //derived class must implement this!
};

class Thread : public runnable //derived from runnable!
{
public:
    void newthread()
    {
        CreateThread(NULL, 0, &runnable::run_thread, this, 0, NULL);
    }
protected:
    DWORD run() //implementing the virtual function!
    {
         /*.....your thread execution code.....*/
    }
}
网友答案:

You have to make that member function static.

The problem here is that every non-static member function has an implicit this parameter and that's in fact what the compiler is trying to tell you - your nin-static member function has signature different from the one you expected.

Also see this answer to a closely related question.

分享给朋友:
您可能感兴趣的文章:
随机阅读: