pthread_create und Klassen
-
Hallo,
ich weiss nicht ob ich das jetzt richtig verstanden hab. Aber für mich klingts so als ären static Methoden das was du suchst.
class MyClass{ public: static void *Thread(void){// tu was } }; int main(void){ pthread_t thread1; pthread_create(&thread1, NULL,MyClass::Thread,NULL); }
-
Hallo!
Wenn du Memberfunktionen als Thread starten möchtest, musst du sie als
static deklarieren.Ich würde dir empfehlen so vorzugehen:
class thread { public: // damit den thread starten void start (void* threadParameter = NULL); private: // wird von start aufgerufen und ruft dann... // (pthis == pointer auf die klasse die start (void*) aufgerufen hat.) static void* linuxpthread (void* pthis); // .. diese funktion auf. hier kommt die action! void dofancystuff (void* data) = 0; // zwischenspeicher für den threadparameter void* param; };
So sieht meine Linuxpthreadwrapperklasse (
) aus.
Implementation und abgeleitete Klassen musst du erstellen.Hoffe das hilft dir
Edit: Da war ja einer schneller..
-
Wenns dir nicht aufs Lernen ankommt wie das geht dann nimm boost.
-
Hi, danke für die Antworten.
Muss man, wenn man unter Linux mit Klassen arbeitet was beachten? Denn ich bekomme einen fehler wenn ich versuche auf die Memberfunktion zuzugreifen:
In functionmain': : undefined reference to
CTestklasse::Thread(void)'Ich habe es testweise unter Windows erstellt und da erhalte ich keinen Fehler.
Bin noch totaler Newbie// main.cpp #include "Test.h" int main() { CTestklasse test; test.Thread(); return 0; } // Test.h class CTestklasse { public: void Thread(); }; // Test.cpp #include "Network.h" void CTestklasse::Thread() { return 0; }
Bevor ich die Codebeispiele für Threads teste sollte ich erst mal das in den Griff bekommen. Hab erst ein Buch über c++ gelesen und das war für Windows, aber da ich hauptsächlich mit Linux arbeite möchte ich unter Linux proggen.
Danke für eure HilfeMfG
-
SucheHilfe schrieb:
Hi, danke für die Antworten.
Muss man, wenn man unter Linux mit Klassen arbeitet was beachten? Denn ich bekomme einen fehler wenn ich versuche auf die Memberfunktion zuzugreifen:
In functionmain': : undefined reference to
CTestklasse::Thread(void)'Ich habe es testweise unter Windows erstellt und da erhalte ich keinen Fehler.
Bin noch totaler Newbie[..} // Test.cpp #include "Network.h" // <---- müsste doch Test.h sein void CTestklasse::Thread() { return 0; // <--- return 0 in einer void Funktion? Nene.. so nicht! }
[..]
-
Headhunter schrieb:
SucheHilfe schrieb:
Hi, danke für die Antworten.
Muss man, wenn man unter Linux mit Klassen arbeitet was beachten? Denn ich bekomme einen fehler wenn ich versuche auf die Memberfunktion zuzugreifen:
In functionmain': : undefined reference to
CTestklasse::Thread(void)'Ich habe es testweise unter Windows erstellt und da erhalte ich keinen Fehler.
Bin noch totaler Newbie[..} // Test.cpp #include "Network.h" // <---- müsste doch Test.h sein void CTestklasse::Thread() { return 0; // <--- return 0 in einer void Funktion? Nene.. so nicht! }
[..]
Ja, hab ich nur falsch kopiert, in meinem Tutorial heißt die Datei Network. Bei mir heißt die aber schon Test.h. Und die "0" bei return hab ich auch gelöscht, geht aber trotzdem nicht. Selber Fehler
-
du linkst nicht richtig.
Aus dem Grund sollte man erst den Umgang mit C/C++ und dem Compiler lernen und dann mit Threads oder so was anfangen
-
kingruedi schrieb:
du linkst nicht richtig.
Aus dem Grund sollte man erst den Umgang mit C/C++ und dem Compiler lernen und dann mit Threads oder so was anfangen
Und was mach ich falsch? Ich hab ein Tutorial über den Compiler gelesen und mache nichts anderes als dort drinnen steht
-
Hallo,
hmm das einzige was mir einfällt ist, dass du die entsprechende Objectdatei von
Testclass nicht dazu linkst. Sonst sollte der Compiler das eigentlich können, wenn du die Methode implementiert hast. IMHO braucht man das nicht explizit zusammenlinken. Ein fachesg++ -o MeinProgram MainProgrammmain.cpp CTestclass.cpp
sollte es eigentlich machen.
Oder wenn dus eben schon mit
g++ -c CTestclass.cpp
g++ -c Program.cppzu einer Objektdatei kompiliert hast, musst du die dazu nehmen.
g++ -o MeinProgram Program.o CTestclass.o
-
Danke, jetzt klappt das auch mit dem Compiler.
Ich hatte ihn folgendermaßen aufgerufen:
g++ -o Test *.cpp
Das hat bei der Version die ich hatte nicht geklappt, hab jetzt gcc auf den neusten Stand gebracht, jetzt klappt das auch.
Morgen werd ich das dann mit den Threads versuchen