![]() |
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:
Leider funzt das ganze nicht, wenn ich in der Whileschleife bin. Muss ich dafür evtl. einen extra Thread starten???
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. Gruß Sascha |
Re: Anwendung beenden während Endlosschleife
Entweder das oder mit Application.ProcessMessages die Nachrichtenwarteschleife abarbeiten.
|
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.
|
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... |
Re: Anwendung beenden während Endlosschleife
Nun leider funktioniert das auch nicht immer, habe u. a. mal das
![]() Schönes Wochenende! |
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:
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.
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. Aber evtl. weiß ja noch jemand eine andere Lösung... |
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. |
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...
|
Re: Anwendung beenden während Endlosschleife
Zitat:
Einfach eine entsprechende Verknüpfung anlegen und einen Tastaturshortcut dafür definieren. Fertig in < 1min. Und das mit Boardmitteln. |
Re: Anwendung beenden während Endlosschleife
ich werde mir das mal ansehen...
Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz