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;
これとかエラーになるけど、前後見たら普通に補ってくれてもー、とちと思ってしまう。