AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi AllocateHwnd: GetMessage zerstört den Hauptthread

AllocateHwnd: GetMessage zerstört den Hauptthread

Ein Thema von Neutral General · begonnen am 24. Mär 2008 · letzter Beitrag vom 25. Mär 2008
 
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, 14: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
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz