запускать потоки функции-члена класса в c ++ - PullRequest
5 голосов
/ 12 января 2011

Как следует из названия.Ниже приведен скелет моего кода.

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);
    ...
}

функция B нуждается в переменных-членах CLASS.
Но у меня есть код ошибки, когда я скомпилировал это.
Это "не может преобразовать аргумент3 от 'DWORD (__stdcall CLASS :: *) (LPVOID)' до 'LPTHREAD_START_ROUTINE' "или что-то в этом роде.
Я не знаю, совпадает ли это в английской среде.1009 * Может кто-нибудь помочь, пожалуйста?

Ответы [ 3 ]

11 голосов
/ 12 января 2011

Серьезно, используйте std :: thread (или boost :: thread, если ваш компилятор пока не поддерживает):

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

void CLASS::A()
{
    boost::thread(&CLASS::B, this, your args go here);
}
10 голосов
/ 12 января 2011

Вы должны определить свою функцию обратного вызова как static функцию, если она является функцией-членом!


Лучший дизайн: определить класс многократного использования!

Из моего предыдущегоответ : (с небольшими изменениями)

Еще лучше было бы определить класс для повторного использования с чистой виртуальной функцией run(), который будет реализован производным потоком классы.Вот как это должно быть оформлено:

//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.....*/
    }
}
3 голосов
/ 12 января 2011

Вы должны сделать эту функцию-член static.

Проблема здесь в том, что каждая нестатическая функция-член имеет неявный параметр this, и именно это пытается сказать вам компилятор.- у вашей функции-статического члена подпись отличается от той, которую вы ожидали.

Также см. этот ответ на тесно связанный вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...