AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Anwendung beenden während Endlosschleife

Ein Thema von Bomberbb · begonnen am 5. Sep 2008 · letzter Beitrag vom 10. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#1

Anwendung beenden während Endlosschleife

  Alt 5. Sep 2008, 09:32
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Anwendung beenden während Endlosschleife

  Alt 5. Sep 2008, 09:33
Entweder das oder mit Application.ProcessMessages die Nachrichtenwarteschleife abarbeiten.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Anwendung beenden während Endlosschleife

  Alt 5. Sep 2008, 09:45
Wenn du mit Halt arbeitest kannst du auch einfach einen weiteren Thread nehmen der die Tasten prüft und dann dort ein halt machen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#4

Re: Anwendung beenden während Endlosschleife

  Alt 5. Sep 2008, 10:08
@ 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...
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#5

Re: Anwendung beenden während Endlosschleife

  Alt 5. Sep 2008, 13:33
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!
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#6

Re: Anwendung beenden während Endlosschleife

  Alt 9. Sep 2008, 09:09
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...
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Anwendung beenden während Endlosschleife

  Alt 9. Sep 2008, 11:33
[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.
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#8

Re: Anwendung beenden während Endlosschleife

  Alt 9. Sep 2008, 13:54
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...
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Anwendung beenden während Endlosschleife

  Alt 9. Sep 2008, 13:59
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.
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#10

Re: Anwendung beenden während Endlosschleife

  Alt 9. Sep 2008, 14:24
ich werde mir das mal ansehen...

Danke!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:58 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