Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Ist es möglich über TParallel eine Procedure zum ausführen zu übergeben?

  Alt 4. Apr 2018, 10:11
Eine der "billigsten" Varianten mit TThread wäre z.B.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
begin
  Button1.Caption := '...';
  S := 'A B C';
  TThread.CreateAnonymousThread(procedure
    begin
      Sleep(3000);
      S := ReverseString(S);
      //...
      TThread.Synchronize(nil, procedure
        begin
          Button1.Caption := S;
        end);
    end).Start;
end;
Aber das Erstellen/Starten eines Thread verbraucht einiges an Systemressourcen (ist langsam).

Mit TTask kann man das ähnlich machen.
Aber dort kann man einen eigenen ThreadPool angeben oder den globalen ThreadPool nutzen, wobei diese Threads wiederverwendet und nicht immer neu erstellt werden.
Auch kann man die maximale Anzahl gleichzeitiger Tasks steuern und es gibt NotifyEvents, wenn einer/alle Tasks fertig sind und das Teil kann noch viel mehr.

TTask, TFuture, TParallel usw. bassieren aud TThread und erweitern es um weitere Features, die du dann nicht selber implementieren mußt, vor allem in Bezug auf eine bessere Verwaltung der Thread-Ressourcen.
TFeature ist ein TTask mit "tu was" und zusätzlich einem Delphi-Referenz durchsuchenTFeature.GetValue (gib mit das Ergebnis und warte notfalls, falls noch nicht fertig).

Du kannst z.B. selber eine ArbeitsListe für einen/mehrere Threads verwalten.
Delphi-Quellcode:
var
  List: TThreadList<string>;

procedure TDeinWorkerThread.Execute;
var
  LockedList: TList<string>;
  Value: string;
begin
  while not Terminated do begin
    Value := '';
    LockedList := List.LockList;
    try
      if LockedList.Count > 0 then begin
        Value := LockedList[0];
        LockedList.Delete(0);
      end;
    finally
      List.UnlockList;
    end;
    if Value <> 'then begin
      Sleep(3000);
      Value := ReverseString(Value);
      //...
      Synchronize(procedure
        begin
          Form10.Button1.Caption := Value;
        end);
    end else
      Sleep(100);
  end;
end;
Und dann fänst du auch noch an die Behandlung zu optimieren usw.

Oder eben die TTask oder TFeature, wo dafür schon Einiges eingebaut ist.
$2B or not $2B
  Mit Zitat antworten Zitat