GeneralB Geschrieben 6. April 2010 Teilen Geschrieben 6. April 2010 Guten Morgen, ich habe vorhin angefangen mit etwas mit Threads in C++ zu beschäftigen und möchte nun welche in ein bestehendes Programm eincoden. Hierzu soll mir ein Thread eine Methode einer Klasse aufrufen. Wie genau kann ich der Threadfunktion die Instanz der Klasse übergeben? Die MSDN Infos zum Thema haben mich nur mehr verwirrt. Wäre toll wenn mir da jemand helfen könnte. VG GeneralB const int iMaxTNum = 5; int toQuit = 0; struct targ { int val; }; DWORD WINAPI bla( void* param ); [ ... meine Klassen ... ] Threads[1] = CreateThread( NULL, 0, bla, (void*)&ThreadArgs[1], 0, (LPDWORD)&ThreadIDs[ 1 ] ); // Aufruf [...] DWORD WINAPI bla( void* param ) { targ *threadarg = (targ*)param; while( toQuit != threadarg->val ) { cout << "Tick\n"; Sleep( 500 ); //param->getOrt(); } return 0; } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 6. April 2010 Teilen Geschrieben 6. April 2010 Erweitere die Struktur targ, z.B. um einen Zeiger auf deine Klasseninstanz. Du solltest übrigens nicht CreateThread benutzen, wenn du in der Threadfunktion Funktionen der C-Standardbibliothek aufrufst. Benutz besser _beginthreadex. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
GeneralB Geschrieben 6. April 2010 Autor Teilen Geschrieben 6. April 2010 habe hier ein paar Codestücke vergessen... const int iMaxTNum = 5; int toQuit = 0; DWORD WINAPI bla( void* param ); [ ... Klassen ... ] struct targ { int val; Person &player; }; targ ThreadArgs[ iMaxTNum ]; int ThreadIDs[ iMaxTNum ]; HANDLE Threads[ iMaxTNum ]; ThreadArgs[1].val = 1; Threads[1] = CreateThread( NULL, 0, bla, (void*)&ThreadArgs[1], 0, (LPDWORD)&ThreadIDs[ 1 ] ); [ ... Rest von main ... ] DWORD WINAPI bla( void *player ) { //targ *threadarg = (targ*)player; int check = 1; while( check == 1 ) { cout << "Tick\n"; Sleep( 500 ); } return 0; } Muss dazu sagen, dass ich bisher keine Ahnung von Threads habe, auch die Argumente sind mir etwas schleierhaft. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
GeneralB Geschrieben 6. April 2010 Autor Teilen Geschrieben 6. April 2010 So, mein Problem hat sich gelöst. Der Fehler war das umcasten. Threads[1] = CreateThread( NULL, 0, bla, (void*)&player, 0, (LPDWORD)&ThreadIDs[ 1 ] ); // Fettes muss void sein, deswegen unten wieder der recast [...] DWORD WINAPI bla( void* param ) { Person* player = (Person*) param; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 6. April 2010 Teilen Geschrieben 6. April 2010 So, mein Problem hat sich gelöst. Der Fehler war das umcasten.Das ist keine gute Lösung. Auf diese Art und Weise kannst du nämlich immer nur einen Parameter übergeben. Wer immer die Struktur targ eingeführt hat, wird sich doch etwas dabei gedacht haben. Der Parameter val ist jetzt beispielsweise nicht mehr verfügbar. Und sobald du noch etwas anderes übergeben musst, musst du doch wieder die Struktur benutzen. Du solltest übrigens einen Zeiger (Player*) hinzufügen. Player& ist eine Referenz. Geht auch, muss dann aber bereits bei der Initialisierung mit einer gültigen Instanz verbunden werden. Nachträgliche Zuweisung geht nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.