AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TTask parametrisieren

Ein Thema von ISMIRSCHLECHT · begonnen am 5. Jun 2019 · letzter Beitrag vom 6. Jun 2019
Antwort Antwort
ISMIRSCHLECHT

Registriert seit: 17. Dez 2018
Ort: Görlitz
69 Beiträge
 
#1

TTask parametrisieren

  Alt 5. Jun 2019, 13:43
Delphi-Version: 10.1 Berlin
Guten Tag,

meine Frage ist sehr einfach:
Wenn ich ein Objekt
  meinTask:ITask instantiiere, habe ich nur eine anonyme Prozedur, die ich auch noch als Quelltext übergebe. Wie kriege ich Daten beim Aufruf in den Task ?
Oder braucht man das nicht ? Schwer vorstellbar.
Oder muß ich etwa die Variablen aus dem aufrufenden Thread benutzen ?
Mit großer Spannung
ism
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#2

AW: TTask parametrisieren

  Alt 5. Jun 2019, 13:48
Ein Code-Beispiel würde die Frage klarer machen und eine konkrete Antwort erlauben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: TTask parametrisieren

  Alt 5. Jun 2019, 13:51
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:
  1. http://docwiki.embarcadero.com/RADSt...oden_in_Delphi
  2. https://de.wikipedia.org/wiki/Closure_(Funktion)
  Mit Zitat antworten Zitat
ISMIRSCHLECHT

Registriert seit: 17. Dez 2018
Ort: Görlitz
69 Beiträge
 
#4

AW: TTask parametrisieren

  Alt 6. Jun 2019, 09:37
Guten Morgen,

zum Quelltext :
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 aTask: ITask;
begin
 aTask := TTask.Create (procedure ()
   begin
     sleep (3000); // 3 seconds
     ShowMessage ('Hello');
   end);
 aTask.Start;
end;
Dieses Beispiel wird gern kreuz und quer durch die Foren kopiert und ist natürlich voll nutzlos.

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:
aTask := TTask.Create (meineprozedur);
// weiter hinten
procedure meineprozedure
  begin
  WasTun;
  end;
Wenn ich ein Objekt definiere, welches die übliche Variablenausstattung hat und in sich den TTask startet, könnte ich also äußere Variablen reinbringen.
Gute Idee ?

ism
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#5

AW: TTask parametrisieren

  Alt 6. Jun 2019, 09:43
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;
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#6

AW: TTask parametrisieren

  Alt 6. Jun 2019, 10:35

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:
aTask := TTask.Create (meineprozedur);
// weiter hinten
procedure meineprozedure
  begin
  WasTun;
  end;
Wenn ich ein Objekt definiere, welches die übliche Variablenausstattung hat und in sich den TTask startet, könnte ich also äußere Variablen reinbringen.
Gute Idee ?
Wenn man etwas komplexeres in einem Hintergrundtask erledigen lassen will ist es durchaus eine gute Idee, alle notwendigen Daten in ein Objekt zu packen und dann eine Methode dieses Objektes an TTask.Create zu übergeben. Dadurch sind alle Felder etc. des Objektes für die im Task laufende Methode zugänglich und man kann z. B. auch die Ergebnisse im Objekt ablegen. Man muss nur darauf achten, dass das Objekt auch am Leben bleibt bis der Task damit durch ist.

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.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#7

AW: TTask parametrisieren

  Alt 6. Jun 2019, 10:59
Do kannst die Task-Procedure auch als Function-Result zurückgeben:
Delphi-Quellcode:
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;
BTW, das ShowMessage sollte besser mit dem VCL-Thread synchronisiert werden, aber das ist ja auch nur ein sinnloses Beispiel.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
ISMIRSCHLECHT

Registriert seit: 17. Dez 2018
Ort: Görlitz
69 Beiträge
 
#8

AW: TTask parametrisieren

  Alt 6. Jun 2019, 11:26
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz