![]() |
Delphi-Version: 10.1 Berlin
TTask parametrisieren
Guten Tag,
meine Frage ist sehr einfach: Wenn ich ein Objekt
Delphi-Quellcode:
instantiiere, habe ich nur eine anonyme Prozedur, die ich auch noch als Quelltext übergebe. Wie kriege ich Daten beim Aufruf in den Task ?
meinTask:ITask
Oder braucht man das nicht ? Schwer vorstellbar. Oder muß ich etwa die Variablen aus dem aufrufenden Thread benutzen ? Mit großer Spannung ism |
AW: TTask parametrisieren
Ein Code-Beispiel würde die Frage klarer machen und eine konkrete Antwort erlauben.
|
AW: TTask parametrisieren
Bis dahin: Das "Binden" von Variablen ist kein einfaches Thema.
Es ist viel zu lesen, aber diese zwei Links kann ich schon einmal vorab empfehlen: |
AW: TTask parametrisieren
Guten Morgen,
zum Quelltext :
Delphi-Quellcode:
Dieses Beispiel wird gern kreuz und quer durch die Foren kopiert und ist natürlich voll nutzlos. :-D
procedure TForm1.Button1Click(Sender: TObject);
var aTask: ITask; begin aTask := TTask.Create (procedure () begin sleep (3000); // 3 seconds ShowMessage ('Hello'); end); aTask.Start; end; Aber nehmen wir mal an, ich möchte mehrere Select - Anfragen losjagen, mit (einfacher Fall) EINEM Suchparameter, den würde ich gern in den TTask reinbringen. Die Seitenempfehlung mit dem Closure existiert übrigens nicht. Die Hilfe, die Embarcadero anbietet, ist unter aller Kanone. Was ist eigentlich der Vorteil von TTask ggü TThread ? Nebenbei, ich kann die Prozedur auch "weiter hinten" benannt definieren und dann beim Constructor einbinden:
Delphi-Quellcode:
Wenn ich ein Objekt definiere, welches die übliche Variablenausstattung hat und in sich den TTask startet, könnte ich also äußere Variablen reinbringen.
aTask := TTask.Create (meineprozedur);
// weiter hinten procedure meineprozedure begin WasTun; end; Gute Idee ? ism |
AW: TTask parametrisieren
Ich möchte einen Task erzeugen und dabei einen Parameter übergeben - kein Problem
Delphi-Quellcode:
function DoSomethingInTask(Argument: Integer): ITask;
begin Result := TTask.Run( procedure var I: Integer; begin for I := 1 to Argument do begin // do whatever TThread.Sleep(10); end; end); end; procedure foo; var t: ITask; begin t := DoSomethingInTask(20); ... end; |
AW: TTask parametrisieren
Zitat:
TTask vs TThread: Der Vorteil bei einem TTask ist halt, dass man sich um den ausführenden Thread keine Gedanken machen muss, der kommt aus einem Threadpool innerhalb der RTL. Leider ist das auch der größte Nachteil: man hat keine Kontrolle darüber, welcher Thread den Task ausführt, und das kann durchaus ein Problem sein, insbesondere bei Interaktionen mit einer Datenbank. Eine DB Connection/Session ist meist an den Thread gebunden, der sie erzeugt hat. Das kann man durchaus handeln, wenn man sich selbst einen TThread-Abkömmling baut, aber mit TTasks funktioniert das kaum. |
AW: TTask parametrisieren
Do kannst die Task-Procedure auch als Function-Result zurückgeben:
Delphi-Quellcode:
BTW, das ShowMessage sollte besser mit dem VCL-Thread synchronisiert werden, aber das ist ja auch nur ein sinnloses Beispiel.
procedure TForm432.Button1Click(Sender: TObject);
begin TTask.Create(MakeTaskProc(3000, 'Hallo')).Start; end; function TForm432.MakeTaskProc(ADelay: Integer; const AMsg: string): TProc; begin Result := procedure begin sleep (ADelay); ShowMessage(AMsg); end; end; |
AW: TTask parametrisieren
Danke erstmal für die Antworten.
Ein einhüllendes Objekt mit eigenen Variablen wäre also die Antwort. Ich glaube, das nennt man Closure ?? Also ich bleibe vorsert bei Threads, lsm 8-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz