Verwenden von TTask aus der Parallel Programming Library

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Verwenden der Parallel Programming Library


Die Parallel Programming Library (PPL) stellt die Klasse TTask bereit, mit der eine Aufgabe oder mehrere Aufgaben parallel ausgeführt werden können. Eine Aufgabe (Task) ist eine Arbeitseinheit, die erledigt werden muss. Die PPL übernimmt die Zuordnung zwischen der Aufgabe und dem Thread, der die Aufgabe durchführt, damit Sie mehrere Aufgaben parallel ausführen können, ohne eigene benutzerdefinierte Threads erstellen und verwalten zu müssen.

TTask erstellt und verwaltet die Interaktion mit Instanzen von ITask. ITask ist ein Interface, das eine Reihe von Methoden und Eigenschaften für den Start, das Warten (Wait) und den Abbruch (Cancel) sowie eine Eigenschaft für den Status (Created, WaitingToRun, Running, Completed, WaitingForChildren, Canceled, Exception) bereitstellt.

Mit WaitForAll und WaitForAny von TTask kann auf den Abschluss aller oder einer beliebigen Aufgabe gewartet werden. WaitForAll informiert Sie über den Abschluss aller Aufgaben und WaitForAny über die erste Aufgabe, die abgeschossen wurde. Zum Beispiel: Wenn zwei Aufgaben, A und B, 3 bzw. 5 Sekunden benötigen, erhalten Sie das Ergebnis in der folgenden Zeit:

In dem folgenden Beispiel wird die Methode WaitForAll verwendet:

Object Pascal:
 
procedure TFormThreading.MyButtonClick(Sender: TObject);
var 
 tasks: array of ITask; 
 value: Integer; 
begin 
 Setlength (tasks ,2); 
 value := 0; 

 tasks[0] := TTask.Create (procedure () 
   begin 
   sleep (3000); // 3 seconds 
   TInterlocked.Add (value, 3000); 
  end); 
 tasks[0].Start; 

 tasks[1] := TTask.Create (procedure () 
   begin 
   sleep (5000); // 5 seconds 
   TInterlocked.Add (value, 5000);
 end); 
 tasks[1].Start; 
 
 TTask.WaitForAll(tasks); 
 ShowMessage ('All done: ' + value.ToString); 
end;
C++:
void __fastcall TFormThreading::MyButtonClick(TObject *Sender)
{
   _di_ITask tasks[2];

   tasks[0] = TTask::Create(_di_TProc(new TCppTask(lvalue, 3000, Label1)));
   tasks[0]->Start());
   
   tasks[1] = TTask::Create(_di_TProc(new TCppTask(lvalue, 5000, Label1)));
   tasks[1]->Start());

   TTask::WaitForAll(tasks,(sizeof(tasks)/sizeof(tasks[0])-1));
   ShowMessage("All done! "+IntToStr(lvalue));
}

Eine weitere Funktionalität von TTask ist das Verhindern der Sperrung der Benutzeroberfläche, wenn Sie im Hintergrund etwas starten möchten. Im folgenden Beispiel wird gezeigt, wie Sie eine einzelne Aufgabe ausführen und starten:

Object Pascal:
 
procedure TFormThreading.Button1Click(Sender: TObject);
var
 aTask: ITask;
begin
 aTask := TTask.Create (procedure ()
   begin
     sleep (3000); // 3 seconds
     ShowMessage ('Hello');
   end);
 aTask.Start;
end;
C++:
void __fastcall TFormThreading::Button1Click(TObject *Sender)
{
  Label1->Caption = "--";
  lvalue = 0;
  _di_ITask aTask = TTask::Create(_di_TProc(new TCppTask(lvalue,3000,Label1)));
  aTask-> Start();
  Label1->Caption =InToStr(lvalue);
}

Siehe auch