Auf Herunterfahren reagieren
-
hallo miteinander!
ich habe hier ein Programm und ein Problem
und zwar läuft das Programm in einer art dauerschleife. Die schleife wird durch bestimmte events,die der user auskösen kann, verlassen. danach ist das programm sozusagen wieder "frei" und reagiert auf mausklicks etc.wenn jetzt aber Windows heruntergefahren wird, kann das programm nicht richtig beendet werden, weil es ja noch in der Schleife hängt.
Die Frage is also, ob man aus einer funktion heraus irgendwie prüfen kann, ob Windows gerade davor steht, heruntergefahren zu werden?
Oder muss man da einfach sagen: Pech gehabt, schlechtes programmlayout

vielleicht weiss ja jemand ne antwort

grüße!
-
Sorge dafür, daß die Schleife nicht länger als sagen wie mal 10 Sekunden ohne jede Überprüfung der Runterfahremessage ist.
Ich habe in einer Konsoleanwendung einif(wantKill) throw KillException();im cout.flush() drin und die Schleifen fluschen cout oft genug.
Dazu müßtest Du die Schleife in einem anderen Thread haben.Alternativ kannst Du (vermute ich) auch, den Step der Message-Pump auslagern und bei jedem .flush() oder Sleep oder halt bei i%1024==0 aufrufen.
-
hallo volkard!
und danke für deine antwort.leider reicht mein wissen nicht aus um aus deinem post so richtig schlau zu werden

Du sagst, dass in der schleife einfach eine Überprüfung der runterfahrmessage stattfinden soll - ja das is klar.
doch was genau soll ich denn überprüfen? wie krieg ich die "runterfahrmessage"?
Also ich meine als beispiel: gibts nich iwo meinetwegen ne funktion "IsWindowsAboutToShutDown" die man einfach abrufen könnte? Oder so ähnlich?Ob die behandlung der message dann über Exceptions oda wie auch imemr stattfinden soll, ist eigentlich erstmal egal.
Dein letzter Vorschlag über die Auslagerung des Steps der Message-Pump
Kannst du das präzesieren? 
-
Oh, das ist viel. Ich wollte Dich nicht umhauen, sorry.
Kannst Du ein deinem Projekt ähnliches minimales Projekt basteln, das irgendwie Userevents verarbeitet und dabei dieses genannte Problem hat, daß es nicht sauber beendet wird, weil es noch in einer Schleife hängt?
So als *.rar oder *.zip oder so und den Link hier posten.
Vielleicht findet sich dann jemand, der eine schlaue Idee hat, wie man mit wenigen Handgriffen dein Beispielprojekt verfummelt, daß es schnell und sauber terminiert. Oder nur schnell. Oder nur sauber. Wünsch Dir am besten nur schnell, das dürfte am einfachsten sein.
-
mh ich glaube inzwischen eine lösung gefunden zu haben

deine stichwörter ham mich wohl auf den richtigen pfad gebracht.
die situation war ja dass das programm in einer endlosschleife hängt.
wenn die nicht durch den benutzer beendet wird, und dann windows runterfahren will, kam es halt zu der "programm kan nnicht beendet werden"-meldung.abhilfe schafft bei mir der einfache aufruf von
while {1} { // ... if(PeekMessage(&mesg,NULL,17,17,PM_NOREMOVE)) { break;} //... }ich weiss nicht ob man das so einfach machen darf,
oder stilistisch mal wieder als unsauber gilt
,
jedenfalls funktioniert es
vielen dank an volkard!
-
Wieso lagerst du die Endlosschleife nicht in einen Thread aus und setzt ein Abbruch-Flag hin?
So kann auch der User selber die Schleife abbrechen. Aber es würde auch gehen, wenn du die NachrichtWM_ENDSESSIONerhälst. In beiden Fällen setzt du einfach das Abbruch-Flag und die Endlosschleife im Thread bricht ab.Grüssli
-
Den selben Vorschlag wollte ich gestern auch machen. Dann ist mir aber eingefallen, dass WM_ENDSESSION nicht in die Message Queue eingereiht wird. Die Nachricht wird direkt an eine entsprechende Fensterprozedur gesendet.
-
Warum nicht den ganzen Vorgang in einen eigenen Thread verlagern und die UI über den "Main-Thread" laufen lassen?