pthreads Thread wird nicht gestartet
-
Hi,
Ja ich möchte möglichst keine fremden libs verwenden. Außerdem geht es mir noch um den lern-Faktor. Ich will nicht einfach das Programm fertig haben, sondern möchte dabei etwas lernen.MFG ReduX :xmas1:
-
@ReduX: das is echt die richtige einstellung
-
DEvent schrieb:
Wenn du schon C++ verwendest, wieso nutzt du nicht alle Vorteile von C++? Anstatt einfach Boost::Thread zu verwenden, plagst du dich mit C-threads rum?
boost::thread war im Umfang das letzte mal als ich mir das angesehen habe noch recht eingeschränkt
-
Hi,
Irgendwie habe ich nun keine Idee mehr, ich habe mir mal das workaround vorgenommen das gepostet wurde und das ist dabei herausgekommen:
Header:struct data { char array[4096]; int len; compile funktion; }; class client { private: //blabla static void* helprecive(void *arg); static void* helpsend(void *arg); void emfpange(compile func); void sending(char buffertosend[4096]); public: //blabla void send2server(char buffertosend[4096]); void recv2server(compile func); };
CPP:
void network::client::send2server(char buffertosend[4096]) { data foo; int t = strlen(buffertosend); for(int i=0;i<t;i++) { foo.array[i]=buffertosend[i]; } #ifdef WIN32 #else pthread_t t1; pthread_create(&t1,0,helpsend,&foo); #endif } static void* network::client::helpsend(void* arg) { sending(static_cast<data*>(arg)->array); } void network::client::sending(char buffertosend[4096]) { //blabla } void network::client::recv2server(compile func) { if(empfange == false) { data funktion; funktion.funktion = func; #ifdef WIN32 #else pthread_t t1; pthread_create(&t1,0,helprecive,&funktion); #endif } } static void* network::client::helprecive(void* arg) { compile func = static_cast<data*>(arg)->funktion; empfange(func); } void network::client::empfange(compile func) { //blabla func(recvbuffer,strange); }
Werde dabei mit Fehlermeldungen überflutet:
/home/server/Desktop/networklib/network.cpp:43: Fehler: Elementfunktion »static void* network::client::helpsend(void*)« kann nicht deklariert werden, statische Bindung zu haben /home/server/Desktop/networklib/network.cpp: In static member function »static void* network::client::helpsend(void*)«: /home/server/Desktop/networklib/network.cpp: At global scope: /home/server/Desktop/networklib/network.cpp:61: Fehler: Elementfunktion »static void* network::client::helprecive(void*)« kann nicht deklariert werden, statische Bindung zu haben /home/server/Desktop/networklib/network.h: In static member function »static void* network::client::helprecive(void*)«: /home/server/Desktop/networklib/network.h:28: Fehler: ungültige Verwendung des Elementes »network::client::empfange« in statischer Elementfunktion /home/server/Desktop/networklib/network.cpp:63: Fehler: von dieser Stelle /home/server/Desktop/networklib/network.cpp: At global scope: /home/server/Desktop/networklib/network.cpp:65: Fehler: keine Elementfunktion »void network::client::empfange(void (*)(char*, int))« in Klasse »network::client« deklariert /home/server/Desktop/networklib/network.cpp: In member function »void network::client::empfange(void (*)(char*, int))«: /home/server/Desktop/networklib/network.cpp:66: Fehler: invalid use of member (did you forget the »&« ?) /home/server/Desktop/networklib/network.cpp:69: Fehler: invalid use of member (did you forget the »&« ?)
Habe da den Durchblick verloren
MFG ReduX :xmas1:
-
Du kannst aus der statischen Funktion keine »normalen« Memberfunktionen aufrufen.
Daher auch der Vorschlag this als argument zu übergeben, da du static_cast<Server>(this)->funktion() aufrufen kannst.
-
Hi,
Wie kann ich dann aber Parameter übergeben?
Weil das was der User bei dem Funktionsaufruf übergibt brauch ich ja dann noch in der Funktion die vom Thread gestartet wird!MFG ReduX :xmas1:
-
entweder du baus dir eine struct, die sowohl die daten als auch »this« anthält oder du speicherst die Daten in einem Member deines Objektes zwischen.
-
Hi,
Ich speichere es nun als Member bekomme jedoch noch ein paar Fehler:
Header:class client { private: //blabla static void helprecive(void *arg); static void helpsend(void *arg); void emfpange(); void sending(); public: /blabla void send2server(char buffertosend[4096]); void recv2server(compile func); };
cpp:
void network::client::send2server(char buffertosend[4096]) { //blabla pthread_t t1; pthread_create(&t1,0,&helpsend,this); } } static void network::client::helpsend(void* arg) { static_cast<client>(arg)->sending(); } void network::client::sending() { //blabla }
Fehler:
/home/server/Desktop/networklib/network.cpp:41: Fehler: ungültige Umwandlung von »void (*)(void*)« in »void* (*)(void*)« /home/server/Desktop/networklib/network.cpp:41: Fehler: Argument 3 von »int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)« wird initialisiert /home/server/Desktop/networklib/network.cpp: At global scope: /home/server/Desktop/networklib/network.cpp:45: Fehler: Elementfunktion »static void network::client::helpsend(void*)« kann nicht deklariert werden, statische Bindung zu haben /home/server/Desktop/networklib/network.cpp: In static member function »static void network::client::helpsend(void*)«: /home/server/Desktop/networklib/network.cpp:46: Fehler: keine passende Funktion für Aufruf von »network::client::client(void*&)« /home/server/Desktop/networklib/network.cpp:2: Anmerkung: Kandidaten sind: network::client::client(char*, int, bool) /home/server/Desktop/networklib/network.h:20: Anmerkung: network::client::client(const network::client&)
Die Fehlermeldungen beziehen sich auf den oben geposteten Code.
MFG ReduX :xmas1:
-
static void network::client::helpsend(void* arg) { static_cast<client>(arg)->sending();}
=>
static void * network::client::helpsend(void* arg) { static_cast<client*>(arg)->sending();return 0;}
Die funktion gibt void* zurück und du castest auf client*
-
Hi,
Habe nun alles soweit hinbekommen. Jedoch bekomme ich noch bei der deklaration der static funktion folgenden Fehler:Fehler: Elementfunktion »static void* network::client::helprecive(void*)« kann nicht deklariert werden, statische Bindung zu haben
Mein C++ Buch hat da leider auch keine antwort darauf.
Frohes Neues noch!
MFG ReduX