Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Konsolenanwendung Programmende abfragen (https://www.delphipraxis.net/214299-konsolenanwendung-programmende-abfragen.html)

knochen 20. Dez 2023 12:45

Delphi-Version: 10.3 Rio

Konsolenanwendung Programmende abfragen
 
Hallo zusammen,

ich habe eine Konsolenanwendung und möchte abfragen, ob das Programm gerade beendet wird. Bei VCL Anwendungen geht das ja mit
Delphi-Quellcode:
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

dummzeuch 20. Dez 2023 12:50

AW: Konsolenanwendung Programmende abfragen
 
Zitat:

Zitat von knochen (Beitrag 1531023)

ich habe eine Konsolenanwendung und möchte abfragen, ob das Programm gerade beendet wird. Bei VCL Anwendungen geht das ja mit
Delphi-Quellcode:
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?

himitsu 20. Dez 2023 13:36

AW: Konsolenanwendung Programmende abfragen
 
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)

Kas Ob. 20. Dez 2023 16:50

AW: Konsolenanwendung Programmende abfragen
 
Zitat:

Zitat von knochen (Beitrag 1531023)
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);

Sinspin 21. Dez 2023 10:20

AW: Konsolenanwendung Programmende abfragen
 
Delphi-Quellcode:
Try ... finally
im Hauptprogramm zwischen
Delphi-Quellcode:
begin
und
Delphi-Quellcode:
end;
.
Was in finally kommt ist dann ganz zum Schluss.

knochen 21. Dez 2023 11:26

AW: Konsolenanwendung Programmende abfragen
 
Ich danke euch für eure Antworten. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22: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