Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Application.Terminate in Vista (https://www.delphipraxis.net/91129-application-terminate-vista.html)

PeterPanino 30. Apr 2007 01:38


Application.Terminate in Vista
 
Hallo, wenn ich in Vista Application.Terminate; ausführe, ist der Prozess nach dem Beenden des Programms immer noch im Task-Manager zu sehen, läuft also noch. Kann das jemand reproduzieren?

Hansa 30. Apr 2007 01:44

Re: Application.Terminate in Vista
 
Man könnte das schon mal testen. Aber das Application - Object zu benutzen und das unter Vista ? Macht das Sinn ? :P

Luckie 30. Apr 2007 01:46

Re: Application.Terminate in Vista
 
Zitat:

Zitat von Hansa
Aber das Application - Object zu benutzen und das unter Vista ? Macht das Sinn ? :P

Was hat das eine mit dem anderen zu tun?

PeterPanino 30. Apr 2007 01:58

Re: Application.Terminate in Vista
 
Zitat:

Zitat von Hansa
... Aber das Application - Object zu benutzen und das unter Vista ? Macht das Sinn ? :P

Wieso soll das keinen Sinn machen?

Luckie 30. Apr 2007 02:08

Re: Application.Terminate in Vista
 
Weil jede VCL Anwendung das "Application Objekt" benutzt:
Delphi-Quellcode:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Und warum sollte man unter Vista keine Methoden dieses Objektes aufrufen?

Zu deinem Problem: Laufen eventuell noch irgendwelche nicht beendeten Threads?

Hansa 30. Apr 2007 02:09

Re: Application.Terminate in Vista
 
Zitat:

Zitat von Luckie
Was hat das eine mit dem anderen zu tun?

Dann teste selber diese fragwürdige Sache. :mrgreen: Kenne niemanden, der Application ohne Not direkt einsetzt. Und das Terminate scheint noch schlimmer zu sein, was man so hört. 8) Aber egal. Gebraucht wird es jedenfalls normalerweise nicht. Auf diesen Umstand wollte ich hinweisen. Mit Gewalt etwas passend zu machen, ja das geht irgendwie immer. Unter Vista vielleicht aber auch nicht. :zwinker:

Luckie 30. Apr 2007 02:22

Re: Application.Terminate in Vista
 
Auch das ist Blödsinn. TApplication.Terminate tut nichts anders als MSDN-Library durchsuchenPostQuitMessage, also eine ganz normale API Funktion, aufzurufen:
Zitat:

The PostQuitMessage function posts a WM_QUIT message to the thread's message queue and returns immediately; the function simply indicates to the system that the thread is requesting to quit at some time in the future.
Und das ist eine ganz normale Art ein Windows GUI Programm zu beenden.

PeterPanino 30. Apr 2007 02:39

Re: Application.Terminate in Vista
 
Zitat:

Zitat von Luckie
... Zu deinem Problem: Laufen eventuell noch irgendwelche nicht beendeten Threads?

Keine eigenen Threads; was Komponenten betrifft, müsste ich das mal prüfen. Der Aufruf von Application.Terminate erfolgt im OnCreate-Event des Hauptformulars. (Nachher werden noch andere Formulare erzeugt; offensichtlich werden die noch erzeugt, obwohl Application.Terminate aufgerufen wurde, und dann erst das Programm beendet). Habe schon überlegt, ob ich deswegen nicht Halt verwenden sollte.

Luckie 30. Apr 2007 02:44

Re: Application.Terminate in Vista
 
Also mit Halt fährst du dein Programm nun wirklich gegen die Wand. Du solltest mal überlegen, ob es Sinn ergibt, was du da machst. Du steigst in das Auto ein und willst gleichzeitig wieder aussteigen. Das kann irgendwie nicht gehen. Also entweder steigst du erst gar nicht ein oder du steigst erst richtig ein und steigst dann wieder aus.

SirThornberry 30. Apr 2007 06:03

Re: Application.Terminate in Vista
 
Naja, mit Halt fährt man nicht wirklich gegen die Wand. Es ist auch eine "normale" Variante sein Programm zu beenden mit dem Vorteil einen Rückgabewert setzen zu können.

Luckie 30. Apr 2007 12:06

Re: Application.Terminate in Vista
 
Aber so viel ich weiß, werden dann keine DLLs mehr entladen. Allerdings bin ich mir da nicht ganz sicher.

CCRDude 30. Apr 2007 12:32

Re: Application.Terminate in Vista
 
Ich kenne das unter Vista hauptsächlich mit Indy 9: Indy 9 ist da ganz gemein und gibt eine critical section nicht frei (selbst wenn man die Units nur einbindet, aber nicht benutzt - muß wohl am initialization-Teil einer der Units liegen), hab deswegen alle Programme, die ich aus rausgebe, auf Synapse umgestellt. Eigene ähnliche Fehler sind natürlich genauso kritisch, daher ganz allgemein: FastMM4 benutzen und alle Memory Leaks beheben, wenn das Programm dann mal ohne Leaks beendet, dann klappts auch mit Vista ;)

Christian Seehase 30. Apr 2007 12:42

Re: Application.Terminate in Vista
 
Moin Peter,

Zitat:

Zitat von PeterPanino
Der Aufruf von Application.Terminate erfolgt im OnCreate-Event des Hauptformulars.

das klingt für mich so, als solltest Du Deine Programmstruktur mal überdenken.
Wenn irgendeine Prüfung an der genannten Stelle dazu führt, dass das Programm nicht weiterlaufen soll, solltest Du die Prüfung lieber in der Projektdatei vornehmen.

BTW:
Application.Terminate verwende ich auch ungern, da hier, u.A., OnCloseQuery/OnClose nicht aufgerufen werden.

Flocke 30. Apr 2007 13:35

Re: Application.Terminate in Vista
 
Zitat:

Zitat von Christian Seehase
Zitat:

Zitat von PeterPanino
Der Aufruf von Application.Terminate erfolgt im OnCreate-Event des Hauptformulars.

das klingt für mich so, als solltest Du Deine Programmstruktur mal überdenken.

Da kann ich nur zustimmen. PostQuitMessage legt nämlich einfach eine Meldung in die Message-Queue, die vom Programm dann in der normalen Meldungsschleife abgeholt und verarbeitet wird (oder auch nicht: das "while GetMessage(...) do ..." bricht dann nämlich ab, da die Bedingung FALSE ist).

An diesen Punkt (Meldungsschleife) kommt die Anwendung aber normalerweise erst in Application.Run. Also werden alle automatisch erzeugten Formulare, Berichte und Datenmodule (alles was in der DPR-Datei vor dem Application.Run steht) zunächst noch erzeugt (laufen also durch das OnCreate), bevor dein Application.Terminate Wirkung zeigt.

PeterPanino 1. Mai 2007 12:34

Re: Application.Terminate in Vista
 
Zitat:

Zitat von Flocke
... An diesen Punkt (Meldungsschleife) kommt die Anwendung aber normalerweise erst in Application.Run. Also werden alle automatisch erzeugten Formulare, Berichte und Datenmodule (alles was in der DPR-Datei vor dem Application.Run steht) zunächst noch erzeugt (laufen also durch das OnCreate), bevor dein Application.Terminate Wirkung zeigt.

Danke für diese genaue Schilderung, die mit dem von mir beobachteten Verhalten übereinstimmt. Ich verwende nun doch Halt vor Application.Initialize (natürlich mit Fehlermeldung) um beim Fehlen von für die Anwendung vitalen Elementen das Programm zu beenden.

PeterPanino 1. Mai 2007 12:37

Re: Application.Terminate in Vista
 
Zitat:

Zitat von Christian Seehase
Wenn irgendeine Prüfung an der genannten Stelle dazu führt, dass das Programm nicht weiterlaufen soll, solltest Du die Prüfung lieber in der Projektdatei vornehmen.

Ja, das mache ich jetzt, danke für den Hinweis.

Christian Seehase 1. Mai 2007 13:05

Re: Application.Terminate in Vista
 
Moin Peter,

Zitat:

Zitat von PeterPanino
Ich verwende nun doch Halt vor Application.Initialize (natürlich mit Fehlermeldung) um beim Fehlen von für die Anwendung vitalen Elementen das Programm zu beenden.

Auf das Halt kannst Du verzichten.

Delphi-Quellcode:
begin
  // Prüfung der Programmvoraussetzungen
  if Fehler then begin
    // Sprechende Meldung(en) ausgeben
  end else begin
    Application.Initialize;
    Application.CreateForm(....);
    Application.Run;
  end;
end.


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