Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Anwendung beenden während Endlosschleife (https://www.delphipraxis.net/120072-anwendung-beenden-waehrend-endlosschleife.html)

Bomberbb 5. Sep 2008 09:32


Anwendung beenden während Endlosschleife
 
Hallo,

ich hab mir gedacht, es wäre nett, wenn ich meine mittels Tastenkombi ohne Taskmanager beenden könnte, wenn es sich aufhängt.

Hab dann auch folgendes geschrieben:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    Procedure OnAppMsg(Var Msg : TMsg;Var Handled : Boolean);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := OnAppMsg;
end;

Procedure TForm1.OnAppMsg(Var Msg : TMsg;Var Handled : Boolean);
Begin
  If (Msg.message = WM_KEYDOWN) and (Msg.wParam = VK_F12) Then
      Halt;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  sleep(100);
  showmessage('jetzt');
  while true do
    sleep(0);
end;

end.
Leider funzt das ganze nicht, wenn ich in der Whileschleife bin. Muss ich dafür evtl. einen extra Thread starten???

Gruß

Sascha

DeddyH 5. Sep 2008 09:33

Re: Anwendung beenden während Endlosschleife
 
Entweder das oder mit Application.ProcessMessages die Nachrichtenwarteschleife abarbeiten.

SirThornberry 5. Sep 2008 09:45

Re: Anwendung beenden während Endlosschleife
 
Wenn du mit Halt arbeitest kannst du auch einfach einen weiteren Thread nehmen der die Tasten prüft und dann dort ein halt machen.

Bomberbb 5. Sep 2008 10:08

Re: Anwendung beenden während Endlosschleife
 
@ DeddyH: Nun daran hab ich auch schon gedacht, aber zum einen haben wir eine riesige Menge an Whileschleifen im Prog und da ich nicht der einzige Entwickler bin, steht das dann in neuen Schleifen leider auch nicht drin.

@ SirThornberry: Muss ich dann nicht einen Tastaturhook mit einem thread verknüpfen? hab leider von beidem noch recht wenig Ahnung...

Bomberbb 5. Sep 2008 13:33

Re: Anwendung beenden während Endlosschleife
 
Nun leider funktioniert das auch nicht immer, habe u. a. mal das
http://www.delphi-treff.de/tutorials...-hooks/page/5/ ausprobiert, leider gibts da auch das Problem, dass es während der Schleife nicht funktioniert. Wie dem auch sein: Montag gehts weiter:

Schönes Wochenende!

Bomberbb 9. Sep 2008 09:09

Re: Anwendung beenden während Endlosschleife
 
Nun ich hab mich noch ein wenig mit dem Thema befasst und bin zu folgender Lösung gekommen: Ein lokaler Thread!
Das bietet mir den Vorteil, dass sie Tastenkombi nun fürs ganze Programm gültig ist, nicht nur für ein Formular.
Delphi-Quellcode:
Var
  KeyHook                              : HWND;

Function KeyProc(nCode : Integer;wParam : WPARAM;lParam : LPARAM) : LRESULT; Stdcall;
Begin
  Result:=CallNextHookEx(KeyHook, nCode, wParam, lParam);
  If (nCode >= HC_ACTION) And (wParam = VK_CANCEL) Then
  Begin
    UnHookWindowsHookEx(KeyHook);
    Halt;
  End;
End;

Initialization
  KeyHook := SetWindowsHookEx(WH_KEYBOARD, @KeyProc, 0, GetCurrentThreadId);
Finalization
  if KeyHook <> 0 then
    UnHookWindowsHookEx(KeyHook);
End.
Das Problem mit der Schleife allerdings bleibt. Der lokale Thread scheint während der Schleife nicht aufgerufen zu werden, obwohl das eigentlich meinem Verständnis von Threads widerspricht??? Einen globalen Thread möchte ich hier nicht unbedingt verwenden. Also bleibt mir nur die Möglichkeit mit Application.ProcessMessages in den Whileschleifen.

Aber evtl. weiß ja noch jemand eine andere Lösung...

ralfiii 9. Sep 2008 11:33

Re: Anwendung beenden während Endlosschleife
 
[quote="Bomberbb"]@ DeddyH: Nun daran hab ich auch schon gedacht, aber zum einen haben wir eine riesige Menge an Whileschleifen im Prog und da ich nicht der einzige Entwickler bin, steht das dann in neuen Schleifen leider auch nicht drin.

Ist das kein Problem das Programm einfach abzustechen?!?
Werden keine Daten gespeichert odgl. ?
In dem Fall könntest du mit einem separatem Programm (oder auch in einem separatem Thread in deinem Programm) deine Anwendung (den Prozess) on demand ja einfach killen.

Bomberbb 9. Sep 2008 13:54

Re: Anwendung beenden während Endlosschleife
 
Das ganze zielt darauf hinaus, dass die Kunden nicht in den Taskmanager müssen, wenn sich das Programm aufgehangen hat. Und weil wir auch Kunden mit sehr wenig Computerwissen haben, will ich es so einfach wie möglich halten. Für das Abspeichern der Daten ist es in dem Fall eh zu spät...

ralfiii 9. Sep 2008 13:59

Re: Anwendung beenden während Endlosschleife
 
Zitat:

Zitat von Bomberbb
Das ganze zielt darauf hinaus, dass die Kunden nicht in den Taskmanager müssen, wenn sich das Programm aufgehangen hat. Und weil wir auch Kunden mit sehr wenig Computerwissen haben, will ich es so einfach wie möglich halten. Für das Abspeichern der Daten ist es in dem Fall eh zu spät...

Ich glaube mich zu erinnern, das Sysinternals ein PSKill-Tool hatten, dem du einfach den Anwendungsnamen übergeben kannst.
Einfach eine entsprechende Verknüpfung anlegen und einen Tastaturshortcut dafür definieren. Fertig in < 1min. Und das mit Boardmitteln.

Bomberbb 9. Sep 2008 14:24

Re: Anwendung beenden während Endlosschleife
 
ich werde mir das mal ansehen...

Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 Uhr.
Seite 1 von 2  1 2      

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