GeneralB Geschrieben 6. April 2010 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]
Klotzkopp Geschrieben 6. April 2010 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.
GeneralB Geschrieben 6. April 2010 Autor 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.
GeneralB Geschrieben 6. April 2010 Autor 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; }
Klotzkopp Geschrieben 6. April 2010 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.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden