AGB  ·  Datenschutz  ·  Impressum  







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

Konsolenanwendung Programmende abfragen

Ein Thema von knochen · begonnen am 20. Dez 2023 · letzter Beitrag vom 21. Dez 2023
Antwort Antwort
knochen

Registriert seit: 26. Aug 2009
81 Beiträge
 
Delphi 2006 Professional
 
#1

Konsolenanwendung Programmende abfragen

  Alt 20. Dez 2023, 13:45
Delphi-Version: 10.3 Rio
Hallo zusammen,

ich habe eine Konsolenanwendung und möchte abfragen, ob das Programm gerade beendet wird. Bei VCL Anwendungen geht das ja mit
if csDestroying in Application.ComponentState then ...

Application ist aber in der Unit Forms deklariert. Kann ich das trotzdem verwenden, indem ich forms.pas einbinde oder gibt es eine Entsprechung bei Konsolenanwendungen?

Vielen Dank im Voraus
A fool with a tool remains a fool.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.623 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Konsolenanwendung Programmende abfragen

  Alt 20. Dez 2023, 13:50

ich habe eine Konsolenanwendung und möchte abfragen, ob das Programm gerade beendet wird. Bei VCL Anwendungen geht das ja mit
if csDestroying in Application.ComponentState then ... Application ist aber in der Unit Forms deklariert. Kann ich das trotzdem verwenden, indem ich forms.pas einbinde oder gibt es eine Entsprechung bei Konsolenanwendungen?
Da sich bei Konsolenanwendungen die Aufräumarbeiten stark in Grenzen halten, bezweifle ich, dass es sowas gibt. Zumal es ja bei Konsolenanwendungen, wenn Du nicht selbst Multithreading betreibst, keine (quasi) parallellaufenden Abläufe gibt.

Was genau ist denn das eigentliche Problem, das Du lösen willst?
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Konsolenanwendung Programmende abfragen

  Alt 20. Dez 2023, 14:36
Nja, normal hat man bei Konsolen ja alles hintereinander.

Also einfach den Code für's Ende ans Ende der DPR.
Normal hat die Konsolen-Vorlage ein Try-Except, welches Exceptions nicht neu auslöst, also einfach nach dessen END diesen Code,
oder nochmal ein Try-Finally drumrum.

* So, das war jetzt für das normale Programmende oder wenn eine Exception in deinem Programmcode auftritt.

* Dann gibt es noch den Fall von Strg+C oder Strg+Untbr, sollte das eine Exception auslösen und abbrechen.
* Was das Schließen des Konsolenfensters macht, weiß ich grade nicht. (sowas wie SIGKILL, SIGTERM, SIGINT oder SIGQUIT verhält sich ja unterschiedlich)

* Einen "richtigen" Abschuss des Programms (Terminate) bekommst'e natürlich garnicht mit, weil dein Programm hart abgeschossen wird und nichts mehr ausführt


Geht es wirklich um Threads, dann mußt du das selbst regeln.
* im Hauptthread den Threads Bescheid geben
* und womöglich auf das Ende der Threads warten
* wartest du nicht, dann werden deine Threads hart abgeschossen ... vor allen, weil Delphi beim ProgrammEnde (des Hauptthreads) ein MSDN-Library durchsuchenTerminateProcess auslöst (egal ob Konsole, VCL, FMX usw.)

* Grundsächlich schißet "normal" Windows immer den kompletten Prozess ab (Terminate), wenn eine Exception in irgendeinem Thread (auch dem Hauptthread) bis zum Windows durchrauscht, drum fängt TThrad Exceptions still und heimlich ab (wenn man es im OnTerminate nicht prüft)
$2B or not $2B

Geändert von himitsu (20. Dez 2023 um 14:52 Uhr)
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
353 Beiträge
 
#4

AW: Konsolenanwendung Programmende abfragen

  Alt 20. Dez 2023, 17:50
Application ist aber in der Unit Forms deklariert. Kann ich das trotzdem verwenden, indem ich forms.pas einbinde oder gibt es eine Entsprechung bei Konsolenanwendungen?
Yes you can add Forms to console application, but it is not enough and will not solve your problem as himitsu said, you should capture the signals instead, this is cleaner and the right way with consoles.

To capture these events you need to use SetConsoleCtrlHandler
https://learn.microsoft.com/en-us/wi...olectrlhandler
https://learn.microsoft.com/en-us/wi...handlerroutine
Something like this :
Code:
function HandlerRoutine(dwCtrlType: DWORD): Bool; stdcall;
begin
  Result := false;
  if (CTRL_C_EVENT = dwCtrlType) or (CTRL_BREAK_EVENT = dwCtrlType) then
  begin

    Result := true;
  end;
end;

// setup the callback routine
SetConsoleCtrlHandler(@HandlerRoutine, True);
Kas
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
691 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Konsolenanwendung Programmende abfragen

  Alt 21. Dez 2023, 11:20
Try ... finally im Hauptprogramm zwischen begin und end; .
Was in finally kommt ist dann ganz zum Schluss.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
knochen

Registriert seit: 26. Aug 2009
81 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Konsolenanwendung Programmende abfragen

  Alt 21. Dez 2023, 12:26
Ich danke euch für eure Antworten.
A fool with a tool remains a fool.
  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 04:50 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