![]() |
AllocateHwnd: GetMessage zerstört den Hauptthread
Hi,
Hab schreibe grad ein kleines Programm und es soll erst beendet werden wenn der Computer herunterfährt, bzw. man sich abmeldet. Also dachte ich mir, ich reagiere einfach auf WM_ENDSESSION/WM_QUERYENDSESSION. Dafür brauche ich ein Fenster -> AllocateHwnd. Das Problem ist, dass beim der Hauptthread meiner Anwendung scheinbar abkackt sobald GetMessage aufgerufen wird, denn wenn ich debugge, komme ich weder in die while-Schleife rein, noch dahinter. Das einzige, was nach dem Aufruf von GetMessage noch lebt ist mein vorher erstellter Thread:
Delphi-Quellcode:
Mache ich denn irgendwas falsch? o.O
program FasHQ;
uses Windows, Messages, CommCtrl, SysUtils, Classes; type TDummyWin = class class procedure WndProc(var Message: TMessage); end; var SafeThread: THandle; SafeThreadTerminated: Boolean = false; Quit: Boolean = false; wnd: hwnd; { TDummyWin } // *) Diese Zeilen werden nie erreicht class procedure TDummyWin.WndProc(var Message: TMessage); begin case Message.Msg of // * ff WM_QUERYENDSESSION: begin Quit := true; SafeThreadTerminated := true; Message.Result := Integer(true); end; else Message.Result := DefWindowProc(wnd,Message.Msg,Message.wParam,Message.lParam); end; end; procedure ThreadProc; begin while not SafeThreadTerminated do begin // ein paar Aktionen sleep(1); end; end; var id: Cardinal; msg: TMsg; begin SafeThread := BeginThread(nil,0,@ThreadProc,nil,0,id); wnd := AllocateHwnd(TDummyWin.WndProc); while (GetMessage(msg,0,0,0)) and (not Quit) do // Ab hier kackt der MainThread ab begin TranslateMessage(msg); // * DispatchMessage(msg); // * end; TerminateThread(SafeThread,0); // * DestroyWindow(wnd); // * end. Gruß Neutral General |
Re: AllocateHwnd: GetMessage zerstört den Hauptthread
Also mir wär das ganze schon wichtig ;)
|
Re: AllocateHwnd: GetMessage zerstört den Hauptthread
Meinst du mit deiner Fäkalsprache, dass die Anwendung sich aufhängt (stehen bleibt), eine Endlosschleife durchläuft oder beendet wird? Falls ersteres:
Dir ist schon klar, dass GetMessage blockiert, bis eine Nachricht ankommt? Beim Debuggen kann das schonmal zu seltsamen Effekten führen. Außerdem kannst du an GetMessage auch das Handle übergeben, falls da noch ein anderes Fenster in dem Thread ist und dieses Probleme bereitet. |
Re: AllocateHwnd: GetMessage zerstört den Hauptthread
Hi,
Das mit dem blockieren war mir so unterbewusst schon klar, aber mir war nicht klar, das ich anscheinend keine Messages bekomme :mrgreen: Naja ok son AllocateHwnd-Fenster ist jetzt auch sehr pflegeleicht aus der Sicht von Windows. Mein Problem ist, das ich gerne wissen würde ob mein Code nach der Schleife, die jetzt so aussieht (s.u.) noch ausgeführt wird.
Delphi-Quellcode:
Das Problem ist, das Quit erst = true wenn ich WM_QUERYENDSESSION empfangen habe, die nur ausgelöst wird, wenn ich den PC runterfahre oder mich auslogge. Das Problem dabei ist, das sich das schlecht debuggen lässt :mrgreen:
while not Quit do
begin if PeekMessage(msg,wnd,0,0,PM_REMOVE) then begin TranslateMessage(msg); DispatchMessage(msg); end; sleep(1); end; So und während ich das geschrieben habe ist mir die gloreiche Idee gekommen das ich meinem Fenster auch selbst Messages schicken kann :lol: Ok danke, hat sich erledigt ;) Und sorry wegen der Fäkalsprache ;) Normalerweise schreib ich anders :angel: Gruß Neutral General |
Re: AllocateHwnd: GetMessage zerstört den Hauptthread
Ist jetzt DestroyWindow oder DeAllocateHwnd besser?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz