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;