Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Threads nacheinander ausführen

  Alt 2. Feb 2009, 07:39
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat