Ich würde das straight-forward machen, genauso wie Du es willst:
Threads nacheinander ausführen = Thread Nr.X startet Thread Nr.(X+1)
Du erstellst Dir eine Liste aller Threads und sorgst dafür, das ein Thread beim Beenden (OnTerminate) den nächsten Thread aktiviert.
Delphi-Quellcode:
Var
MyThreadList : TList;
// Of Threads
CurrentThread : TMyThread;
Procedure TMainForm.RunNextThread (Sender : TObject);
Begin
If MyThreadList.Count>0
Then Begin // Wenn noch Threads abzuarbeiten sind,
CurrentThread := TMyThread(MyThreadList[0]);
// nimm den nächsten,
MyThreadList.Delete(0);
// entferne ihn aus der Liste
CurrentThread.Resume;
// und führe ihn aus
End
Else Begin
ShowMessage('
Alle Threads wurden ausgeführt');
FreeAndNil (MyThreadList);
End;
End;
Procedure TMainForm.ExecuteAllThreads;
Var
i : Integer;
myThread : TMyThread;
Begin
{$IFDEF AllowAddingOfThreadsWhileExecuting}
If Assigned (MyThreadList)
Then
Raise Exception.Create('
Es sind noch nicht alle Threads abgearbeitet');
{$ELSE}
If Not Assigned (MyThreadList)
Then
MyThreadList := TList.Create;
{$ENDIF}
For i:=0
to MyThreadCount
do Begin
myThread := TMyThread.Create (...);
// Suspended muss TRUE sein.
myThread.OnTerminate := RunNextThread;
myThread.FreeOnTerminate := True;
// Kannst du so machen oder nicht.
MyThreadList.Add(myThread);
End;
RunNextThread(
nil);
End;
So kannst Du dir das 'warten auf den nächsten Thread' sparen. Die Variable 'CurrentThread' benötigst Du, wenn Du die Anwendung beenden willst, und noch nicht alle Threads abgearbeitet sind. Dann Terminierst Du den 'CurrentThread' und löschst einfach die MyThreadList.