Einzelnen Beitrag anzeigen

Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AllocateHwnd: GetMessage zerstört den Hauptthread

  Alt 24. Mär 2008, 15:05
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:
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.
Mache ich denn irgendwas falsch? o.O

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat