pthread_create mit Methode verwenden
-
Hallo zusammen,
ich habe mir gerade begonnen eine kleine Socket-Klasse zu schreiben.
Nun habe ich für den Fall dass es sich um ein horchendes Socket handelt eine Methode, welche per accept neue Verbindungen annimmt.Diese Methode möchte ich nun innerhalb eines eigenen Threads ausführen lassen.
Ist so etwas überhaupt möglich und wenn ja wie?Hier die wichtigen Codezeilen:
//Main.cpp pthread_create (&p1, NULL, con->acceptClients,0); //Connection.h void* acceptClients(void *); //Connection.cpp void* Connection::acceptClients(void *) { }Die Fehlermeldung dich ich im Moment bekomme lautet:
error: argument of type ‘void* (Connection::)(void*)’ does not match ‘void* ()(void)’
Kann mir außerdem jemand erklären, warum man die Klassendefinition und den eigentlichen Programmcode der Klasse getrennt ablegt? (eine .h und eine .cpp Datei)
Danke schonmal im Vorraus
mcemsi
-
acceptClients
müsste static sein, und einen parameter vom typvoid*übergeben bekommen können.es ist aber nicht static -> signatur passt nicht.
(void*) (*) (Connection * const, void*)
diesen typ sollte deine fkt haben, wenn mich jz nicht alles täuscht.also wie gesagt acceptClients static machen und irgend ne krücke als parameter bauen, z.bsp.:
struct accept_client_parameter { Connection* this_; /*eigentliche daten, die die funktion braucht*/ };bb
PS: voraus - mit einem r
-
Hey,
Danke erstmal für deine Antwort.
Wenn ich versuche sie static zu machen erhalte ich folgenden FehlerConnection.cpp:72: error: cannot declare member function ‘static void* Connection::acceptClients(void*)’ to have static linkage
-
ich rate mal den code dazu
/**.cpp*/ static void* acceptConn(void*) { /*...*/ }richtig?
falls ja: das static muss natürlich nur in der header-datei beim deklarieren der funktion hin:
/* *.h*/ struct conn { static void* accept(void*); };/* *.cpp*/ #include "*.h" void* conn::accept(void*) { /*...*/ }wieso du void* zurückgibst, verstehe ich auch nicht - hast du dir dabei was gedacht oder wolltest du nur die fehlermeldung wegmachen?
bb
-
ja, das galt bloß der Fehlermeldung.
ich poste am besten mal etwas mehr vom Code.
Das ist vermutlich für jemanden der sich auskennt recht Sinnlos, bzw. umständlich wenn nicht sogar unmöglich wie ich das versuche.//Connection.cpp #include "Connection.h" static void* Connection::acceptClients(void *) { int cID; Client *cli; for(;;) { if ( ( cID = accept ( this->sd , NULL , NULL ) ) < 0 ) { cout<<strerror ( errno ); close ( this->sd ); exit ( EXIT_FAILURE ); }else{ cout<<cID<<endl;; cli = new Client(cID); } } } //Connection.h class Connection { public: static void* acceptClients(void *); }; //main.cpp Connection *con = new Connection("TCP", 4); pthread_t p1; pthread_create (&p1, NULL, con->acceptClients,0);Gruß,
mcemsi
-
mal versucht mehr, als nur die ersten 3 zeilen meines posts zu lesen?

-
ja, hatte das "nur" überlesen

Danke (:
Jetzt stehe ich nur vor dem Problem, dass ich innerhalb der statischen Methode nicht mehr per this-> auf die Attribute zugreifen kann ohne dass diese ebenfalls statisch sind oder?
-
hab ich dir alles schon geschrieben - aber (nicht böse gemeint) vll solltest du dir erst mal die grundlagen angucken?!
struct conn { void accept() { pthread_t p1; hold_data para(this); pthread_create(&p1, NULL, _accept, (void*)para); } private: struct hold_data { conn* this_; hold_data(conn* this_) : this_(this_) {} }; static void* _accept(void* data) { hold_data& m = *reinterpret_cast<hold_data*>(data); m.this_->sock = 0; } SOCKET sock; };so in etwa...
keine ahnung, in wie weit das hier richtig ist - ich hab kein plan von dem unix-os-zeugs...
auch sonst gibts noch mehr als genug fragen - z.bsp. was genau connect machen soll etc.bb
-
Ja,
da hast du vermutlich Recht.
Trotzdem vielen Dank für deine Bemühungen