WM_ENDSESSION und nichtmodaler Dialog



  • Naja, wenn ich einen nichtmodalen Dialog habe, bei dem ich Nachrichten verarbeite, dann verarbeitet der doch auch WM_ENDSESSION. Und sobald diese Nachricht verarbeitet ist, kann Windows mein Programm beenden. Und wenn diese Nachricht mitten beim Aktualisieren kommt, wird mein Programm halt mitten beim Aktualisieren beendet. Und das will ich nicht. Wie muss ich es anstellen, damit das nicht passiert?



  • Hi,

    warum machst du das nicht in nem Thread (ja ich weiß, du willst Sie nicht benutzen), aber ich denk das des am einfachsten wäre.

    Ist es nicht so wenn WM_ENDSESSION kommt, dass gewartet wird bis dein Thread mit seiner Arbeit fertig ist?



  • Du kannst ja mit Events o.ä., im Falle einer schon laufenden Aktualisierung darauf warten, dass diese beendet ist 🙄



  • Leider 😞

    WM_ENDSESSION
    Remarks
    If the wParam parameter is TRUE, the session can end any time after all applications have returned from processing this message. Therefore, an application should perform all tasks required for termination before returning from this message.

    Oder kann mir jemand sagen, an welche Fenster WM_ENDSESSION geschickt wird? Vielleicht gibt's ja doch eine Ausnahme... Im MSDN steht da nichts genaues 😞
    Irgendwie muss ich WM_ENDSESSION "zurückstellen", damit mir nicht mittendrin das Programm beendet wird



  • Wo liegt denn gerade überhaupt dein Problem? Erhältst du manchmal die Nachricht nicht, oder was?



  • Aaaaalso: Ziel eines modallosen Dialogs ist, dass ich in einer Schleife eine längere Prozedur ausführen kann, ohne dass mein Programm hängt; ich rufe dann mit PeekMessage eine Nachrichtenschleife auf.
    Problem: Wenn dazwischen ein WM_ENDSESSION kommt, wird diese Nachricht auch verarbeitet. Sobald diese Nachricht aber verarbeitet wurde, kann mein Prozess jederzeit von Windows gekillt werden.
    Wie muss ich es anstellen, damit genau das nicht passiert?
    Ich müsste denke ich irgendwie die Verarbeitung von WM_ENDSESSION auf "nach der Aktualisierung" verschieben, dann wären meine Probleme mit einem Schlag gelöst, aber wie?



  • Du kannst doch einfach mit CreateEvent und WaitForSingleObject bzw. mit CriticalSections verhindern, dass WM_ENDSESSION währenddessen bearbeitet wird
    Siehe dazu: http://msdn.microsoft.com/library/en-us/dllproc/base/synchronization_functions.asp



  • Ähm, wo muss ich das dann einsetzen? Welches Event muss ich setzen?
    (Geht es denn wirklich nicht ohne Threads?)



  • Ich weiß zwar nicht, ob das so klappt, aber ich du könntest ausprobieren, ob es funktioniert, wenn du bei PeekMessage z.B. PM_QS_INPUT | PM_QS_PAINT angibst (falls das reicht). Ansonsten evtl. vor dem Aufruf von DispatchMessage selbst überprüfen, ob es sich um die WM_ENDSESSION Nachricht handelt, und falls ja nicht dipatchen, sondern speichern und dann nach der Aktualisierung die gespeicherte Nachricht dispatchen 🙄



  • Es hilft alles nichts (naja, nicht so wirklich ;)); ich denke, ich werde dann doch den Weg über Threads gehen 👍
    Danke für eure Geduld 😉


Anmelden zum Antworten