Thread in Methode einer Klasse starten Problem
-
Hallo, ich möchte in der Methode einer Klasse "Server" einen Thread starten und habe das folgendermaßen versucht
(Also ich habe was Threads angeht leider sehr wenig Ahnung)Server.h:
#include <winsock2.h> #include <queue> using namespace std; #ifndef Server__ #define Server__ class Server { public: queue<int> *q; Server(); void beginne_empfang(); DWORD WINAPI ThreadFuncServer(LPVOID data); }; #endifServer.cpp:
#include "server.h" DWORD WINAPI Server::ThreadFuncServer(LPVOID data){ //hier das Empfangen implementieren... return((DWORD)data); } Server::Server(){q = new queue();} void Server::beginne_empfang() { hThread[1] = CreateThread(NULL, 0, ThreadFuncServer, //Hier liegt das Problem (LPVOID)q, 0, &dwThreadID[1]); }Das Problem ist nun ,dass die Methode ThreadFuncServer für den Thread unbekannt ist.
Als Fehlermeldung erhalte ich
Server::ThreadFuncServer": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&Server::ThreadFuncServer", um einen Zeiger auf den Member zu erstellen.
Ändere ich nun den code in
void Server::beginne_empfang() { hThread[1] = CreateThread(NULL, 0, &Server::ThreadFuncServer, //Hier liegt das Problem (LPVOID)q, 0, &dwThreadID[1]); //hier noch weiterschreiben }Dann erhalte ich die Fehlermeldung
'CreateThread': Konvertierung des Parameters 3 von 'DWORD (__stdcall Server::* )(LPVOID)' in 'LPTHREAD_START_ROUTINE' nicht möglich
Es gibt keinen Kontext, in dem diese Konvertierung möglich istWas muß ich schreiben, damit es funktioniert?
-
Du kannst nicht so einfach einen Pointer auf einen Member übergeben, wenn nur ein normaler Pointer verlangt ist als Argument.
Du kannst aber die Funktion ThreadFuncServer statisch machen, dann bei createThread this als parameter für die Funktion ThreadFuncServer angeben und in der Funktion ThreadFuncServer "data" nach "Server*" reinterpret_cast'en.
-
Hallo Andreas,
am einfachsten ist es meines Erachtens die boost-thread-Library zu benutzen. In Deinem Fall sähe das so aus:
#include <iostream> #include <boost/thread/thread.hpp> #include <boost/bind.hpp> class A { public: A( int param1, int param2 ) : m_myInt( param1 ) // eigene Member in der Initialisierungsliste vorbelegen , m_thrd( boost::bind( &A::Run, this, param2 ) ) {} ~A() { // teile ggf. der Schleife in Run mit, dass jetzt Schluss ist m_thrd.join(); // blockiert, solange Thread noch läuft } private: void Run( int parameter ) { using namespace std; cout << "Thread gestartet " << endl; for(;;) { // ... if( Schluss ) break; } } int m_myInt; boost::thread m_thrd; // Achtung MUSS letzter Member sein };wichtig zu wissen: der Thread startet, sobald Du ein Objekt der Klasse A anlegst. Du kannst dem Thread lokale Parameter mitgeben (s.o. param2). Falls Run und andere Methoden auf Member von A zugreifen (s.o. m_myInt) muss Du den Zugriff mit einem Mutex schützen.
Gruß
Werner