thread beenden
-
ich speichere mehrere threads in einem CObArray. jetzt kommt es öfters vor das eine thread entfernt weren soll:
delete oArray->GetAt(i); oArray->RemoveAt(i);
das programm stürtzt ab wenn ich den thread entfernen will (die fehlermeldung bietet mir nur ein assembly an). da das programm nicht abstürtzt wenn ich die zeilen rausnehme muss es aber daran liegen.
meine vermutung:
wenn ich den thread während er noch läuft beende mit delete stürtzt er ab.in der MSDN hab ich keine funktion gefunden den thread anders zu beenden. hat jemand nen vorschlag ?
danke
-
Ich hab mich in C bisher nicht mit threads beschäftigt aber ich hab was gefunden das sich
_endthread
nennt. Das beendet einen Thread der mit _beginthread gestartet wurde.Alternativ hab ich die
ExitThread()
funktion gefunden die das gleiche machtalso beende erst den thread und lösch ihn dann aus deiner oblist, vll gehts dann
-
oh, hätte ich sagen sollen ;), meine threadklasse ist von CWinThread abgeleitet und starte ihn mit AfxBeginThread().
die funktionen kann ich nicht benutzen
-
Gibts da nicht auch AfxEndThread?
-
och, das ist ne gute idee ^^
ok, habe schon ne weile getestet und habe dieses problem:
wenn ich den thread beenden will brauche ich den exitcode, den ich mit GetExitCodeThread() erhalte.
der wert des exitcodes ist 259, die MSDN schreibt:
Warning: If a thread happens to return STILL_ACTIVE (259) as an error code, applications that test for this value could end up in an infinite loop.
wenn ich den thread mit dem exitcodebeende stürtzt das programm ab.
innerhalb der Run()-funktion meines threads sieht es so aus:
am anfang der funktion wird eine bestimme zeit mit Sleep() gewartet. danach führt er dann ein par befehle aus.der thread wird beendet, wenn er noch mitten in der Sleep() funktion 'steckt'. das ist ja das was in der MSDN steht (, oder ??).
was heißt das genau ??
-
Ich hab leider dieses 5 oder 7 Phasenmodel von threads nicht mehr im kopf aber ich glaub ein Thread muss laufen damit man ihn (sauber) beenden kann.
D.h. dein Thread ist nciht mehr in der Sleep Phase wenn du AfxEndThread aufrufst. Vll hängt er sich deshalb auf - kane lösung dafür kann ich dir spontan nicht bieten aber ich schau mich mal um
-
Du kannst nicht einfach dein thread object löschen wärend der thread noch läuft. Sobald er aus dem sleep raus kommt un nen this pointer möchte knallt es, weil es die instanz nicht mehr gibt.
Teil dem thread, über ein event z.b., mit, dass er sich doch bitte beenden möchte und warte dann per WaitForSingleObject(oArray->GetAt(i)->m_hThread,INFINITE) bis thread auch wirklich beendiet wurde. Oder zu setzt m_bAutoDelete auf TRUE, dann kannst du dir das delete sparen. CWinThread löscht sich dann selbst wenn fertig ist
-
danke, nebeneffeckt ist nur das meine komplette anwendung bei WaitForSingleObject() hängt. aber ich hab jetzt doch ne lösung
danke, das mit m_bAutoDelete ist auch ganz gut.
-
Wenn du das in einem Thread mit dem WaitForSingleObject() machst dann dürfte nur der Thread hängen. Du kannst dann auch WaitForMultipleObjects() nutzen und dann mit Events steuern, ob er nun sich beenden oder mit seiner Aufgabe fortfahren soll.