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;