Metoda z klasy jako nowy wątek

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Metoda z klasy jako nowy wątek

Post 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?
Micha3
Piegowaty Guziec
Piegowaty Guziec
Posty: 6
Rejestracja: 03 lut 2006, 21:07
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: Metoda z klasy jako nowy wątek

Post 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);
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: Metoda z klasy jako nowy wątek

Post 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
Micha3
Piegowaty Guziec
Piegowaty Guziec
Posty: 6
Rejestracja: 03 lut 2006, 21:07
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: Metoda z klasy jako nowy wątek

Post autor: Micha3 »

mój błąd:
ma być
Network*n=(Network*)v;
zamiast
Network*n=(Network)v;
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: Metoda z klasy jako nowy wątek

Post 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();
Micha3
Piegowaty Guziec
Piegowaty Guziec
Posty: 6
Rejestracja: 03 lut 2006, 21:07
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: Metoda z klasy jako nowy wątek

Post 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)
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: Metoda z klasy jako nowy wątek

Post 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);
pest
Piegowaty Guziec
Piegowaty Guziec
Posty: 5
Rejestracja: 20 paź 2007, 17:06
Płeć: Mężczyzna
Wersja Ubuntu: 7.10
Środowisko graficzne: GNOME
Kontakt:

Odp: Metoda z klasy jako nowy wątek

Post 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
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 18 gości