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
TFeature.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.