AGB  ·  Datenschutz  ·  Impressum  







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

Asynchron Dinge sammeln, in bestimmter Zeit

Ein Thema von Der schöne Günther · begonnen am 11. Jul 2017 · letzter Beitrag vom 17. Jul 2017
 
Der schöne Günther

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

Asynchron Dinge sammeln, in bestimmter Zeit

  Alt 11. Jul 2017, 17:55
Als Vorwarnung: Ich bin nicht gut was parallele Programmierung angeht. Die PPL aus Delphi habe ich nur ein paar mal oberflächlich verwendet, die OmniThreadLibrary habe ich mir nur kurz angeschaut, nie in der Praxis verwendet (sie sieht aber extrem geil aus).

Ich möchte in einer bestimmten Zeit Datendinger sammeln. Das Sammeln kann lange dauern, es ist aber wichtig dass mein Aufruf nach einer bestimmten Zeit wieder zurückkehrt. Notfalls hat er nichts gesammelt, das ist ok.

Hier einmal ein simples Beispiel für ein Datending mittels IFuture<T>:
Delphi-Quellcode:
uses
   System.SysUtils,
   System.Threading;

function produceData(): TBytes;
begin
   Sleep(5000);
   Result := [42];
end;

function collectData(const timeoutMs: Word): TBytes;
var
   collected: IFuture<TBytes>;
begin
   collected := TTask.Future<TBytes>(produceData);
   if collected.Wait(timeoutMs) then
      Result := collected.Value
   else
      Result := [];
end;
Ist das schon im Ansatz falsch?


Wenn nicht: Ich möchte das jetzt aufblähen auf nicht ein TBytes, sondern mehrere: collectData(..) soll jetzt ein TArray<TBytes> statt TBytes liefern.


Ich tue mich jetzt schwer wie ich das richtig löse. Da ein IFuture<T> sich von ITask ableitet kann ich sagen TTask.WaitForAll(meineTasks, gewünschterTimeout) . Ich würde dann auf alle Futures warten, aber nicht länger als X. Ich nehme alle bislang gesammelten Ergebnisse. Alle anderen Futures die nicht rechtzeitig fertig wurden können ihren Kram noch in Ruhe zu Ende machen, aber es interessiert niemanden mehr.

Wäre das so richtig umgesetzt? Gibt es unter System.Threading (oder anderswo) das schon vorgefertigt oder vereinfacht? Hätte ich konkret etwas davon meine Futures hier in einem eigenen TThreadPool ablaufen zu lassen?

Delphi-Quellcode:
uses
   System.SysUtils,
   System.Threading;

function produceData(): TBytes;
begin
   Sleep( Random(5000) );
   Result := [Random(100)];
end;

function collectData(const timeoutMs: Word): TArray<TBytes>;
type
   TFuture = IFuture<TBytes>;
var
   futures:   TArray<ITask>;
   task:      ITask;
begin
   futures := [
      TTask.Future<TBytes>(produceData),
      TTask.Future<TBytes>(produceData),
      TTask.Future<TBytes>(produceData)
   ];

   TTask.WaitForAll(futures, timeoutMs);
   Result := [];
   for task in futures do
      if (task.Status = TTaskStatus.Completed) then
         Result := Result + [TFuture(task).Value];
end;

Vielen Dank im Voraus, ich bin gespannt.
  Mit Zitat antworten Zitat
 

 

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 18:28 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