Erneuter Threadstart nach einmaliger beendung
-
Dir ist hoffentlich klar, daß WaitForSingleObject() den externen Thread NICHT beendet (das legt höchstens deinen Thread auf Eis, bis der andere fertig ist). Wenn du den Thread "nur" anhalten willst, ist das jedenfalls nicht der richtige Ansatz - also: Was genau hast du vor?
-
hi
also
der thread, von dem ich spreche, gibt nachrichten zurück, wenn ich an der seriellen schnittstelle daten empfange.
dann bin ich in den code der nachricht reingegangen, muss da den thread anhalten, xyz andere zeilen ausführen und danach den thread wieder starten
ich hatte da schonmal an sowas wie eine while schleife gedacht, aber das find ich irgendwie böse
wie meinst du das, dass WaitForSingleObject das nicht tut? also ich hab mal debuggt und er läuft erst weiter, wenn in dem thread AfxEndThread aufgerufen wird
-
WaitForSingleObject() macht genau das, was der Name andeutet - es wartet darauf, daß ein Sync-Objekt aktiv wird (und ein Thread wird "aktiv", wenn er von sich aus fertig ist). (Randfrage: Wo genau hast du das eingebaut?)
Für dich ist womöglich ein Ansatz mit Events am günstigsten - der Thread wartet, bis das Hauptprogramm den Event setzt:
CEvent ev; //Thread while(!finished) { Recieve(msg); switch(msg.code) { case DATA_MESSAGE: ::SendMessage(parent,WM_THDATA); WaitForSingleObject(ev,INFINIE); break; ... } } //Hauptprogramm void OnThdata()//Verarbeitet WM_THDATA Nachrichten { ... ev.PulseEvent(); }
-
also:
in der OnInitDialog() starte ich den thread mit AutoDelete FALSE
dann habe ich in der gleichen klasse die methoden zur bearbeitung der nachrichten implementiert.
wenn jetzt nun nachricht xy gesendet wird von dem thread, geht er in die nachrichtenbehandlungsroutine rein, wo ich dann sofort einen schalter auf false setze, der im thread in einer while schleife abgefragt wird. sollte der auf false sein, geht er aus der schleife und führt mir den AfxEndThread aus
so, nach setzen des schalters hab ich dann meine WaitForSingleObject mit den nötigen übergabeparametern
wen ich haltepunkte setze, sehe ich, wie er aus der schleife gehtu nd AfxEndThread ausführt
danach gehts weiter bei mir im Code
und am ende der nachrichtenbehandlungsroutine setze ich den schalter wieder auf true und starte den thread wieder
-
In dem Fall sorgt aber nicht das WaitForSingleObject() dafür, daß sich der Thread beendet, sondern das "wo ich dann sofort einen schalter auf false setze"
Mit dem WaitFor.. wartest du nur so lange, bis der Thread diesen Schalter wirklich bemerkt hat.btw, ist es wirklich unbedingt nötig, den Thread während der Nachrichtenverarbeitung komplett abzuschießen? Es dürfte wesentlich resourcenschonender sein, den Thread "nur" mit SuspendThread() einzuschläfern und später mit ResumeThread() wieder zu wecken.
-
achso
dann würde ich also SuspendThread() machen, damit der thread "pausiert" und wenn ich fertig bin ResumeThread() aufrufen um den weiter laufen zu lassen?
und dann kill ich praktisch nur beim beenden meiner anwendung den thread
aber da sollte ich doch warten bis das passiert ist, oder? weil sonst könnte ich probleme wegen dem delete bekommen, wenn das dingen noch net fertig is oder?
-
MSS-Software schrieb:
aber da sollte ich doch warten bis das passiert ist, oder? weil sonst könnte ich probleme wegen dem delete bekommen, wenn das dingen noch net fertig is oder?
Kommt darauf an, was der Thread noch machen will - ihm den Speicher unter dem Hintern wegzuziehen ist keine besonders gute Idee, in dem Fall eindeutig "JA"

-
*gggg*
neeee, nicht wirklich

dann kommen da immer so kooooooomische fenster bit roten icons und so *ggg*
neee, alles klar
weiß ich bescheid
danke dir

-
ehm, wenn ich jetzt
this->thread->SuspendThread();aufrufe, stürzt mir das Programm ab.
Hab ich da was falsch gemacht?
-
Suspend sollte man nie aufrufen (siehe mein Blog)