読者です 読者をやめる 読者になる 読者になる

ソモサン

私rohkiによる活動や読書の記録をつらつらと書くページです

Delphi の IFuture やら ITask やら

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, System.Threading,
  System.Generics.Collections, System.Classes;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }
    function GetRandomInt(): IFuture<Integer>;
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  TTask.Run(
    procedure
    var
      Tasks: array[0..4] of ITask;
      ValueStrs: array[0..4] of string;
      ii: Integer;
      Sum: Integer;
    begin

      for ii := 0 to 4 do
      begin
        Tasks[ii] := GetRandomInt().Start;
      end;

      TTask.WaitForAll(Tasks);

      Sum := 0;
      for ii := 0 to 4 do
      begin
        Sum := Sum + IFuture<Integer>(Tasks[ii]).Value;
        ValueStrs[ii] := IFuture<Integer>(Tasks[ii]).Value.ToString();
      end;

      TThread.Synchronize(nil,
        procedure
        begin
          ShowMessage(string.Join(' + ', ValueStrs) + ' = ' +  Sum.ToString());
        end
      );
    end
  );
end;

function TForm1.GetRandomInt: IFuture<Integer>;
begin
  Result := TTask.Future<Integer>(
    function: Integer
    begin
      Result := Random(100);
      Sleep(Result * 100);
    end
  );
end;

end.

一応出来たけどさ・・・
無名関数が多すぎ。
あと型推論ジェネリクス書かなくて良くなるともうちょいマシかな。

function TForm1.GetRandomInt: IFuture<Integer>;
begin
  Result := TTask.Future(
    function: Integer
    begin
      Result := Random(100);
      Sleep(Result * 100);
    end
  );
end;

これとかエラーになるけど、前後見たら普通に補ってくれてもー、とちと思ってしまう。