Strona 1 z 1

Metoda z klasy jako nowy wątek

: 02 sty 2010, 19:19
autor: kabanek
witam,

jestem w trakcie pisania projektu i podczas jego pisania natrafiłem na taki problem: mam pewną klasę, w której jest metoda connect()

Kod: Zaznacz cały

void connect()
w kodzie ją wykonuję i wszystko działa poprawnie tylko blokuje mi ta metoda cały program (a ma się wykonywać w czasie 90% czasu uruchomionego programu) i chciałem ją wykonać w oddzielnym wątku. Chciałem to zrobić tak:

Kod: Zaznacz cały

pthread net_thread;
net = new Network(NET_SERVER);
pthread_create( &net_thread, NULL, net->connect, NULL);
no ale wywala błąd.... Próbowałem przerobić deklarację metody connect na analogiczną do tej ze strony http://www.gentoo.org/doc/pl/articles/l-posix1.xml (listening 1.2) i doszedłem do takiej deklaracji

Kod: Zaznacz cały

void *connect(void *arg);
no ale kompilator mi wtedy zwraca taki błąd
error: argument of type ?void* (Network::)(void*)? does not match ?void* (*)(void*)?
i kilka innych. Czy ktoś mógłby mnie nakierować jak stworzyć ten wątek z metody w klasie?

Odp: Metoda z klasy jako nowy wątek

: 02 sty 2010, 19:47
autor: Micha3
może zrób dodatkową metodę statyczną klasy Network:
static void * connectThread(void*v)
{
Network*n=(Network)v;
n->connect();
}

pthread_create( &net_thread, NULL,Network::connectThread, NULL);

Odp: Metoda z klasy jako nowy wątek

: 02 sty 2010, 19:50
autor: kabanek
no coś się ruszyło, ale...
network.cpp: In function ?void* connectThread(void*)?:
network.cpp:21: error: no matching function for call to ?Network::Network(void*&)?
network.cpp:3: note: candidates are: Network::Network(NetConn)
network.h:13: note: Network::Network(const Network&)
network.cpp:22: error: ?void*? is not a pointer-to-object type
make: *** [network.o] Błąd 1

Odp: Metoda z klasy jako nowy wątek

: 02 sty 2010, 20:06
autor: Micha3
mój błąd:
ma być
Network*n=(Network*)v;
zamiast
Network*n=(Network)v;

Odp: Metoda z klasy jako nowy wątek

: 02 sty 2010, 20:08
autor: kabanek
network.cpp: In function ?void* connectThread(void*)?:
network.cpp:22: error: ?void*? is not a pointer-to-object type
make: *** [network.o] Błąd 1
gdzie linia 22 to linia z kodem

Kod: Zaznacz cały

	v->connect();

Odp: Metoda z klasy jako nowy wątek

: 02 sty 2010, 20:19
autor: Micha3
Jedyne co mi jeszcze przychodzi do głowy to błędy parametr przekazywany do funkcji connectThread w
pthread_create( &net_thread, NULL,Network::connectThread, NULL);
Niestety nie pamiętam który z tych nuli to atrybut a który wskaźnik na parametr funkcji connectThread (musisz tam podać wskaźnik na obiekt klasy Network)

Odp: Metoda z klasy jako nowy wątek

: 07 sty 2010, 23:09
autor: kabanek
no ale nie da się podpiąć to bez dodatkowej metody? Przecież w końcu na jedno wychodzi

EDIT:
udało się rozwiązać :)

dla potomnych:
network.h

Kod: Zaznacz cały

                /**
		 * Tworzy nowy wątek
		 */
		static void *Thread(void *net);
network.cpp

Kod: Zaznacz cały

void *Network::Thread(void *net)
{
	Network *self = (Network *)net;

	self->connect();
}
i wywołanie:

Kod: Zaznacz cały

pthread_create(&net_thread, NULL, &Network::Thread, net);

Odp: Metoda z klasy jako nowy wątek

: 23 kwie 2010, 00:23
autor: pest
Witam. Wertując po google z moim problemem natrafiłem na ten post, problem prawie zniknął (uciszył się kompilator) ale program nie działa (segment). Różnica między postem powyżej a moim polega na tym, że ja zamiast wskaźnik na obiekt posiadam iterator na obiekt. Do rzeczy:

device.hh:

Kod: Zaznacz cały

class device{
   public:
   ...
      void GenerujCLK();
      static void* Thread(void *arg);
};

// oraz lista obiektow device
class program {
   private:
      list<device>   list_of_devices;
      ...
   public:
      list<device>::iterator ZnajdzUrzadzenie(unsigned int _adr);
      ...
};

device.cpp:

Kod: Zaznacz cały

void *device::Thread(void *net)
{
	device *self = (device *)net;

	self->GenerujCLK();
}
probowalem takze z takim device.cpp:

Kod: Zaznacz cały

void *device::Thread(void *net)
{
	list<device>::iterator *self = (list<device>::iterator *)net;

	(*self)->GenerujCLK();
}
wywolanie main.cpp:

Kod: Zaznacz cały

int main() {
   pthread_t watek_czasu;
   program symulator(2,2);
   list<device>::iterator _tmp = symulator.ZnajdzUrzadzenie(8);

   pthread_create(&watek_czasu,NULL,&device::Thread,NULL);
   // chodzi o to by watek wywolal _tmp -> GenerujCLK();  :(((
   ...
};
Jak napisalem w komentarzu, chodzi o to by watek wywolal _tmp -> GenerujCLK(); , _tmp jest interatorem z listy obiektów klasy device, która to z kolei zawiera metodą, która musi wykonywać się w tle działania programu z wykorzystaniem wątków. Proszę o pomoc, google nic nie mówi o iteratorach i wątkach... ;/
Blad pamieci na pewno lezy po stronie tych funkcji i/lub watkow, bo normalne wywolanie w main.cpp: _tmp -> GenerujCLK(); dziala az cieszy ;-)

Pozdrawiam