![]() |
Re: Alle subThreads beenden beim programm beenden
also, dateien werden bei dem ganzen nicht verwendet. normalerweise beenden sich die threads auch selber! das problem taucht nur auf, wenn der user wärend der threadlaufzeit das programm-schliesen-symbol drückt. wenn ich dann ein flag setzte, woher soll ich dann wissen, wie lange es dauert, bis alle threads beendet sind und die anwendung sauber beendet werden kann?
|
Re: Alle subThreads beenden beim programm beenden
Hallo Meflin,
Du könntest ja bei jedem Erzeugen eines Threads z.B. einen Zähler mitlaufen lassen, und beim Beenden der Form nachschauen ob der Zähler > 0 ist:
Delphi-Quellcode:
...
TYPE TForm1 = CLASS(TForm) Button1: TButton; PROCEDURE FormCreate(Sender: TObject); PROCEDURE FormCloseQuery(Sender: TObject; VAR CanClose: Boolean); PROCEDURE Button1Click(Sender: TObject); PRIVATE FThreadCounter: Integer; PROCEDURE HandleTerminate(Sender: TObject); PUBLIC END; VAR Form1 : TForm1; IMPLEMENTATION {$R *.DFM} Uses DeineThreadUnit; VAR WorkerThread : TWorkerThread; PROCEDURE TForm1.HandleTerminate(Sender: TObject); // Behandlungsroutine, wenn Thread zerstört wird BEGIN Dec(FThreadCounter); END; PROCEDURE TForm1.FormCreate(Sender: TObject); BEGIN // Voreinstellung: 0 Threads aktiv FThreadCounter := 0; END; PROCEDURE TForm1.FormCloseQuery(Sender: TObject; VAR CanClose: Boolean); // Form wird nur beendet, wenn kein Thread mehr aktiv ist BEGIN CanClose := False; IF FThreadCounter > 0 THEN ShowMessage('Bitte Warten, Threads aktiv!') ELSE BEGIN IF Assigned(WorkerThread) THEN FreeAndNil(WorkerThread); CanClose := True; END; END; PROCEDURE TForm1.Button1Click(Sender: TObject); // Viele, Viele Viele Threads erzeugen BEGIN WorkerThread := TWorkerThread.Create(True); WITH WorkerThread DO BEGIN // Selbstzerstörung FreeOnTerminate := True; // ... // div. Übergaben an Properties des Threads // ... // Threadcounter erhöhen Inc(FThreadCounter); // Behandlungsroutine, wenn Thread zerstört wird OnTerminate := HandleTerminate; Resume; END; END; |
Re: Alle subThreads beenden beim programm beenden
also, da es scheinbar keine einfachere möglichkeit gibt, beende ich alle threads einzeln.
aber: neues problem! ich beende also alle nohc laufenden threads beim OnClose mit endthread (ich verwende nicht das vcl-thread object) und das fenster verschwindet, keine fehlermeldungen, alles paletti... doch: der prozess der application läuft noch!!! was geht denn da schief? |
Re: Alle subThreads beenden beim programm beenden
Hallo Meflin,
Ich dachte nach Deinem letzten Posting, Du möchtest einfach nur warten, bis sich alle Threads von selbst beendet haben und danach erst dem Anwender erlauben das Fenster zu schließen. Wenn Du aber alle offenen Threads auf einem Sitz beenden möchtest würde ich bei VCL-Threads folgendes machen:
Delphi-Quellcode:
// Form1 Private
FMyThreadList: TObjectList; // Form1 create // False unterbindet das automatische Freigeben des Objekts in der Liste nach Delete. FMyThreadList:= TObjectList.create(False); // Beim Erzeugen der Threads FMyThreadList.Add(WorkerThread); PROCEDURE TForm1.HandleTerminate(Sender: TObject); // Behandlungsroutine, wenn Thread zerstört wird // Wenn sich ein Thread selbst beendet hat, muß die // FMyThreadList aktualisiert werden. VAR i : integer; BEGIN FOR i := 0 TO FMyThreadList.Count - 1 DO IF Sender = FMyThreadList[i] THEN BEGIN FMyThreadList.Delete(i); Break; END; END; PROCEDURE TForm1.FormDestroy(Sender: TObject); // Alle Threads killen, und warten bis sie fertig sind. VAR i : integer; BEGIN TRY FOR i := FMyThreadList.Count - 1 DOWNTO 0 DO BEGIN WITH TWorkerThread(FMyThreadList[i]) DO BEGIN // Verhindern, dass HandleTerminate aufgerufen wird OnTerminate := NIL; Terminate; WaitFor; END; FMyThreadList.Delete(i); END; FINALLY FMyThreadList.Free; END; END; |
Re: Alle subThreads beenden beim programm beenden
hmmm... ich verwende aber nicht den vcl thread -/-
*MFG* |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 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