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
Thema durchsuchen
Ansicht
Themen-Optionen

AllocateHwnd: GetMessage zerstört den Hauptthread

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

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

Re: AllocateHwnd: GetMessage zerstört den Hauptthread

  Alt 25. Mär 2008, 14:51
Also mir wär das ganze schon wichtig
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
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#3

Re: AllocateHwnd: GetMessage zerstört den Hauptthread

  Alt 25. Mär 2008, 15:10
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

Re: AllocateHwnd: GetMessage zerstört den Hauptthread

  Alt 25. Mär 2008, 15:55
Hi,

Das mit dem blockieren war mir so unterbewusst schon klar, aber mir war nicht klar, das ich anscheinend keine Messages bekomme 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:
while not Quit do
begin
  if PeekMessage(msg,wnd,0,0,PM_REMOVE) then
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
  sleep(1);
end;
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

So und während ich das geschrieben habe ist mir die gloreiche Idee gekommen das ich meinem Fenster auch selbst Messages schicken kann

Ok danke, hat sich erledigt

Und sorry wegen der Fäkalsprache Normalerweise schreib ich anders

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
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: AllocateHwnd: GetMessage zerstört den Hauptthread

  Alt 25. Mär 2008, 21:12
Ist jetzt DestroyWindow oder DeAllocateHwnd besser?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:51 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