Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ein Programm mit einem Thread beenden (https://www.delphipraxis.net/94563-ein-programm-mit-einem-thread-beenden.html)

nalii 23. Jun 2007 11:47


Ein Programm mit einem Thread beenden
 
Hallo (:

Es geht mir um Folgendes: Ich habe eine Applikation, die automatisch gestartet wird, z.B. beim Systemstart. Das Programm prüft gewisse Dinge ab und startet im betrachteten Fall eine Prozedur. Prozedur ist nicht ganz richtig, denn eigentlich ist es ein Thread.

Das Problem dabei ist nun, dass ich mein Programm auch gerne automatisch beenden wuerde, nachdem der Thread mit dem, was er machen soll, fertig ist. Allerdings kann ich am Ende des Threads nicht eine Art Application.Terminate einbauen, weil der Thread diese Funktion starten wuerde, die Applikation sich aber erst beenden wuerde, wenn der Thread fertig ist. Der ist es aber eben nicht, weil er das Programm nicht terminiert bekommt.

Ich denke momentan mit Sicherheit in die falsche Richtung ^_^ wie kann man das Beenden trotzdem loesen?

Vielen Dank im voraus.

Apollonius 23. Jun 2007 11:56

Re: Ein Programm mit einem Thread beenden
 
Warte doch mit meinThread.waitfor auf das Zurückkehren des Threads, also:
Delphi-Quellcode:
meinthread:=TMeinThread.create(false);
meinThread.waitfor;
Application.terminate;

nalii 23. Jun 2007 14:30

Re: Ein Programm mit einem Thread beenden
 
Zitat:

Zitat von Apollonius
Warte doch mit meinThread.waitfor auf das Zurückkehren des Threads, also:
Delphi-Quellcode:
meinthread:=TMeinThread.create(false);
meinThread.waitfor;
Application.terminate;

Juhuuuuuu :cat:

Vielen Dank, genau das brauchte ich. (:

nalii 23. Jun 2007 18:33

Re: Ein Programm mit einem Thread beenden
 
mh... ok, war ein bisschen zu frueh.

Wenn ich MyThread.Waitfor benutze, bekomme ich eine Exception.

"Das Handle ist ungültig (6)."

Ich habe ein bisschen gegoogelt und heraus gefunden, dass das wohl ein Fehler seitens Borland ist. Meinen Thread starte ich folgendermaßen:

Delphi-Quellcode:
     
      MyThread := MyThread .Create(TRUE);
      MyThread.FreeOnTerminate := TRUE;
      MyThread.Resume;
      MyThread.WaitFor;
Wird FreeOnTerminate auf FALSE gesetzt, bleibt das Handle erhalten. Aber FreeOnTerminate auf FALSE zu setzen, ist doch irgendwie suboptimal... Wie kann ich denn dann sichergehen, dass der Speicher trotzdem freigegeben wird? Mh... naja, wenn ich gleich nach dem Thread.Execute die Applikation schließe, wird dann der Speicher des Threads auch freigegeben?

Apollonius 23. Jun 2007 20:53

Re: Ein Programm mit einem Thread beenden
 
Zwischen Waitfor und Application.terminate einfach noch MeinThread.free einbauen, dann wird der Speicher auch ohne freeonterminate ordnungsgemäß freigegeben.

Aber mal allgemein: Wenn du den Thread startest und dann auf sofort auf seine Rückkehr wartest - warum verwendest du dann einen Thread?

nalii 24. Jun 2007 11:04

Re: Ein Programm mit einem Thread beenden
 
Zitat:

Zitat von Apollonius
Zwischen Waitfor und Application.terminate einfach noch MeinThread.free einbauen, dann wird der Speicher auch ohne freeonterminate ordnungsgemäß freigegeben.

Jep, danke. Das man da in solchen Momenten nicht selber drauf kommt :cat:

Zitat:

Zitat von Apollonius

Aber mal allgemein: Wenn du den Thread startest und dann auf sofort auf seine Rückkehr wartest - warum verwendest du dann einen Thread?

Mhja, weil der Thread in dem Programm zwei Anwendungsbereiche findet. Der zweite kam irgendwann spaeter hinzu (also der, dass alles automatisch starten und sich wieder beenden soll) und am einfachsten / schnellsten dies zu realisieren war, den Thread beizubehalten und bloß entsprechend anzupassen. Aber im Grunde hast du recht, eigentlich waere ein Thread in diesem Fall nicht notwendig.


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