Wątek jako metoda klasy

0

mam metodę klasy:

void* Gracz::start(void* data);

I w konstruktorze chciałbym aby dla każdego obiektu funkcja ta wykonywała się w nowym wątku. Uzywam biblioteki pthreads pierwszy raz i znalazłem przykłądowy program który działał gdy to była normalna funkcja a wątki tworzyłem w funkcji main. Gdy przeniosłem to do klasy
to już nie działa. Polami w mojej klasie są

pthread_t t1, t2;

a w konstruktorze tej klasy chcę uruchomić tą funkcję jako nowy wątek.

pthread_create(&t1, NULL, start, "hello from 1");

Błąd kompilatora:

error C3867: 'Gracz::start': function call missing argument list; use '&Gracz::start' to create a pointer to member 
0

Uruchomienie wątku w konstruktorze nie jest dobrym pomysłem. PThread nie powstała dla C++, tylko dla C - nie ma tam wskaźników do metod, a wskaźniki do metod fizycznie nie są tym samym, co zwykłe wskaźniki. Musisz zrobić funkcję statyczną do wywołania metody na obiekcie, która będzie przyjmowała wskaźnik na obiekt i to ją przekazać do pthread.

Coś w tym stylu:

// pseudokod

class A {

static void run(void *ptr_to_obj) {
// przekazanie wskaźnika do obiektu klasy
// albo jakiejś struktury z odpowiednimi polami
A *a = reinterpret_cast<A*>(obj);

a->metoda();
}

void metoda() {}

};


A a;
pthread_create(&t1, NULL, A::run, &a);

0

ale jak już piszesz w C++ to możesz użyć klasy thread. http://www.cplusplus.com/reference/thread/thread/

1 użytkowników online, w tym zalogowanych: 0, gości: 1