Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programm richtig beenden (https://www.delphipraxis.net/5150-programm-richtig-beenden.html)

looser 25. Mai 2003 19:16


Programm richtig beenden
 
Ein Programm startet per PlaySND eine Wave-Datei.
Wenn das Haupfenster geschlossen wird stoppen ich auch
die Soundwiedergabe (per Befeht in OnClose).
Trotzdem wird im Taskmanager noch ein Task mit dem EXE-Namen
angezeigt der kräftig CPU-Resourcen verbraucht.
Also wie beende ich auch diesen Task ?

mirage228 25. Mai 2003 19:31

versuchs einfach mal mit

Delphi-Quellcode:
  Application.Terminate;

looser 25. Mai 2003 19:43

Muß mich korrigieren.
EXE ist nur einmal im Taskmanager.
Zur normalen Laufzeit der EXE (Sound spielt)
sogut wie keine CPU Auslastung bei EXE.
Habe im OnClose-Ereignis der Form1 nun :

playsound (nil,0,snd_async);
application.terminate;

Sobald ich Proggi mit X beende geht CPU-Auslastung auf
der EXE gegen 100% und EXE läuft halt irgendwie weiter.

mirage228 25. Mai 2003 19:49

application.terminate im onClose??!?!?!?!?!?!

gott bewahre!! mach das DA mal weg!

CalganX 25. Mai 2003 19:58

Zur Info, warum man das NIEMALS machen sollte:
Application.Terminate; terminiert zwar die Anwendung, ruft aber davor noch alle OnClose-Ereignisse des Hauptformulares auf. Somit steckst du in einer Endlosschleife.
Genauso gut/schlecht könntest du schreiben (im OnClose-Ereignis):
Delphi-Quellcode:
// tu irgendwas
Close;
Chris

looser 25. Mai 2003 20:02

:( Jeder saacht mach wech.
Aber wohin sollich es denn tun ? :freak:

mirage228 25. Mai 2003 20:02

Application.Terminate ruft halt nicht die Sachen der onClose Behandlungsroutine auf!!

Daniel B 25. Mai 2003 20:05

Hallo,
Zitat:

Zitat von mirage228
Application.Terminate ruft halt nicht die Sachen der onClose Behandlungsroutine auf!!

Dem muss ich mich anschliessen.

Beendet man das Programm mit Close, so wird auch OnClose aufgerufen, bei App.Terminate ist es aber OnDestroy!

Grüsse, Daniel :hi:

Nachtrag: Wer es ganz genau wissen will:
http://www.delphipraxis.net/viewtopic.php?t=200

Stanlay Hanks 25. Mai 2003 20:07

Eigentlich is doch Application.Terminate nur ein Befehl, der die Anwendung kontrolliert herunterfährt, oder?

Daniel B 25. Mai 2003 20:10

Hallo,
Zitat:

Zitat von Stanlay Hanks
Eigentlich is doch Application.Terminate nur ein Befehl, der die Anwendung kontrolliert herunterfährt, oder?

Ja. Bei Close wird die Anwendung nur geschlossen, aber nicht wirklich beendet. Also sozusagen nur versteckt.
Wenn Du eine Anwendung mit OnClose schliesst, so ist es beim nächsten Programstart sofort da.
Beendest Du aber mit Terminate, so wird auch die Anwendung wieder aus dem Speicher gelöscht und muss beim nächsten Start komplett neu geladen werden.

Grüsse, Daniel :hi:

Stanlay Hanks 25. Mai 2003 20:35

Also könnte man sagen, dass Terminate die durchaus beste Möglichkeit ist, ein Programm zu beenden, und die einzige, um es vollständig zu beenden.

Daniel B 25. Mai 2003 20:53

Hallo,

naja, man muss unterscheiden, Programme die man einmal am Tag öffnet, oder einmal in der Woche, kann man durchaus mit Terminate beenden.
Aber IE, oder OE oder solche sachen die man ständig immer wieder öffnet, Office-Anwendungen usw., da wäre es ein schmarrn das alles jedes mal neu zu laden. Man bedenke die LAdezeiten. Bei einer Anwendung wo die .exe nicht mehr als 5MB hat, wird das kaum jemandem auffalen, aber so richtig grosse sachen muss man sich überlegen.

Grüsse, Daniel :hi:

Luckie 25. Mai 2003 21:02

Zitat:

Zitat von Daniel B
Ja. Bei Close wird die Anwendung nur geschlossen, aber nicht wirklich beendet.

Das wäre mir aber neu. Woher hast du diese Information?

Luckie 25. Mai 2003 21:20

Wie ich es mir schon gedacht habe. Aus der Hilfe:
Zitat:

Terminate is called automatically on a WM_QUIT message and when the main form closes.
Es passiert also folgendes:
Close führt zum Ereignis OnClose der Form in dem zum Schluß das Formular/Fenster geschlossen wird, was auch automatisch dazuführt, das Application.Terminate aufgerufen wird. Ruft man direkt Application.Terminate auf, wird nur das OnClose-Ereignis umgangen.

looser 26. Mai 2003 08:29

:mrgreen: Danke an alle !!

Daniel B 26. Mai 2003 17:50

Hallo,

dennoch habe ich es nach Sonstiges verschoben, die Sparte Programmieren allgemein ist nur für andere Programmiersprachen da.

Grüsse, Daniel :hi:


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