Thread Problem

fh_study

Erfahrenes Mitglied
Hallo

bin gerade dabei ein Mensch Ärgere Dich Nicht Spiel (Projektarbeit für's Studium) in MSVC++ zu schreiben. So weit funktioniert auch schon alles wunderbar. Das Würfeln und das setzen der Spielfiguren wird für jeden Spieler in einem eigenen Thread erledigt.
Nun habe ich jedoch folgendes Problem: Wenn der "Computer" am Zug ist wird auch für ihn ein Thread zum Würfeln geöffnet. Nach dem Würfeln sendet Thread eine Nachricht (SendMessage(WM_MYMSG, (UINT) this);) und beendet dann den Thread. Diese Nachricht ruft die Funktion OnMyMsg auf. Dort wird das Spielfeld neu gezeichnet und überprüft, ob der "Computer" wieder dran ist. Wenn ja wird wieder ein Thread aufgerufen in dem dann berechnet wird was und wohin er setzt. Allerdings geht das anscheinend so schnell, das schon ein neuer Thread geöffnet wird, bevor der alte Thread beendet ist. Diese rufen sich dann immer gegenseitig auf und das ergibt eine Endlosschleife.
Ich bin also quasi auf der Suche nach einer Funktion, die überprüft, ob der Thread beendet ist und wenn nicht auf das beenden des Thread wartet bzw. eine Art OnEndThread (falls es so etwas gibt).
Hoffe mir kann jemand helfen.
 
Du kannst dir ein Event erzeugen (CreateEvent), das du als letzten Befehl im Thread setzt (SetEvent). Von anderen Threads aus kannst du dann prüfen (Mit WaitForSingleObject, Zeit auf 0 setzen), ob das Event gesetzt ist.
 
Ja, da hab ich auch schon dran gedacht, würde meiner Meinung nach jedoch nicht sehr viel bringen. Die Nachricht WM_MYMSG wird direkt vor dem beenden des Thread gesendet, und erzeugt dann in OnMyMsg() einen neuen Thread (wenn der Computer dran ist).
Code:
pView->SendMessage(WM_MYMSG, (UINT) this);
AfxEndThread(0,true);
Das Lustige ist, noch bevor der Thread beendet wird öffnet sich ein neuer, was zu einer explosion der Anzahl der Threads führt.
Habe das ganze jetzt mit nem Timer gelöst. Da es ein Spiel ist, soll der "normale" Spieler ja auch mitbekommen, was der PC macht, ist daher eh ganz sinnvoll. Nach dem Würfeln wird immer berechnet, ob der nächste Spieler dran ist. Dabei natürlich auch, ob es der Spieler oder der Computer ist. Wenn es der Computer ist, wird der Timer gestartet, wenn nicht, wird er gestoppt. Laufzeit jeweils 2000 ms - sollte auf jeden Fall für den Thread zum beenden reichen.
 
Zurück