[C++] Wątek w klasie (unix)

0

Dzień dobry.

Chciałbym się zapytać czy jest możliwość utworzenia wątka w klasie.
Gdy robię to w ten sposób:

pthread_create (&thread_id, NULL, &Watek, NULL);

to występuję błąd:

ISO C++ forbids taking the address of a bound member function to form a pointer to member function.  Say `&TACom::Watek'

Jak temu zaradzić?

0

Kiedyś już się z tym męczyłem. O ile pamiętam, to trzeba było mieć metodę zadeklarowaną jako static. Ale głowy urwać sobie nie dam. To było dosyć dawno.

0

Tak, to bylo static. :)
A jak nie lubisz static, to mozesz sobie napisac wzorzec, ktory pozwala wywolywac w osobnym watku dowolna metode dowolnego obiektu z dowolnymi argumentami. Full wypas. Javowcy moga tylko zzieleniec z zazdrosci. :P

0

Można prosić o jakieś bliższe wyjaśnienie?

0
class Bar {
 
public:
  static void* Foo(void*);
};

// gdzies w kodzie:
pthread_create(&ThreadId, 0, &Bar::Foo, 0);

A co do tego szblonu, to za duzo kodu, zeby tutaj wkleic. Wrzuce na siec, jak dokoncze jeszcze pare drobiazgow. Bedzie open-source.

BTW: W C++ nie uzywa sie NULL tylko 0.

0

W internecie znalazłem ciekawe rozwiązanie:

void* SW(void* arg)

class TThread {
private:
  friend void* SW(void* arg);
  pthread_t thread_id
public:
  void Start(void);
  virtual do_execute(void) = 0; //do nadpisania przez klasę dziedziczącą
};

void TThread::Start(void)
{
pthread_create(&thread_id, NULL, &SW, static_cast<void*>(this));
}

void* SW(void* arg)
{
TThread* w = static_cast<TThread*>(arg);
w->do_execute;
}

W teorii wszystko powinno być ok, jednak po skompilowaniu program nie wchodzi do funkcji SW. Czemu tak się dzieje?

0

Static tez nie dziala:

class TReadThread {
private:
  thread_t thread_id;
  static void* do_execute(void*);
public:
  void Run(void);
};

void TReadThread::Run(void)
{
pthread_create(&thread_id, 0, &do_execute, 0);
}

void* TReadThread::do_execute(void*)
{
while(1)
  {
  fputc('x',stderr);
  }
}

Po stworzeniu obiektu wywoluje funkcje Run (do niej wchodzi), jednak funkcja do_execute juz nie dziala (program nie wchodzi do niej). Co robie zle?

0

Moze po odpaleniu wątku kończysz od razu program? Walnij na koniec sleep(1000). Musi zadziałać.

0

Działa! Tylko zamiast sleep, dokleiłem wątek za pomocą pthread_join. Masz moją dozgonną wdzięczność :)

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