並列プログラミング ライブラリの TTask.IFuture の使用

提供: Appmethod Topics
移動先: 案内検索

並列プログラミング ライブラリの使用 への移動

IFuture は、TTask を実装して、具体的な型を返す関数を起動するようにしたものです。IFuture のインスタンスが TTask.Future<T> で返されます(型パラメータ T は戻り値型を表します)。IFuture のインスタンスを使用することにより、何かを計算したり何らかのクエリを実行しつつ、同時に他のタスクも実行し、必要になったときに IFuture.Value を通じてその値(計算やクエリの結果)を取得することができます。この時点で値の計算がまだ完了していない場合は、現在のタスクがブロックされ、この値が計算されるまで待機します。これにより、希望する順に実行されるようにコード ブロックに優先順位を付けつつも、必要になった時点で必ず値を取得できるようにすることができます。

Object Pascal の場合:

まず、IFuture<T> のインスタンスを宣言します。このコードでは、このインスタンスを使って String を格納します。

  public
    { Public declarations }
    FutureString: IFuture<string>;

無名メソッドとして TTask.Future<T> に渡される実装を次に示します。

FutureString:= TTask.Future<string>(
function:string
  begin
   {Some calculation that takes time}
    Sleep(3000);
    Result:='Hello ' + Random(42).ToString;
  end);

計算値は IFuture.Value を呼び出して取得できます。

MyString := FutureString.Value;
C++ の場合:

まず、IFuture<T> のインスタンスを宣言します。このコードでは、このインスタンスを使って String を格納します。TTask.Future<T> ハンドラ メソッドの実装を保持するメソッドも宣言する必要があります。

public:		// User declarations
	System::DelphiInterface<IFuture__1<System::String> > FutureString;
	System::String __fastcall FutureHandler(TObject* Sender);

TTask.Future<T> ハンドラ メソッドの実装と、そのメソッドの呼び出し方は、以下のとおりです。

System::String __fastcall TForm1::FutureHandler(TObject* Sender){
  // Some calculation that takes time
  Sleep(3000);
  return System::String str = System::String().sprintf(L"Hello %d", Random(42));
}
FutureString = TTask::Future<System::String>(0, this->FutureHandler);

計算値は IFuture.Value を呼び出して取得できます。

MyString = FutureString->Value;

関連項目