チュートリアル:並列プログラミング ライブラリのフューチャを使用する
並列プログラミング ライブラリ関連のチュートリアル への移動
このチュートリアルでは、並列プログラミング ライブラリ(PPL)のフューチャの使い方を説明します。 フューチャとは、結果を返す TTask です。そのため、並列関数と見なすことができます。
このチュートリアルでは、2 つのボタンを持つ簡単なアプリケーションを作成します。1 つのボタンは計算を開始するためのもの、もう 1 つのボタンは値を返すためのものです。フューチャを使用することで、自分が要求したときにこの値を取得することができます。その時にまだ計算が済んでいなければ、済むまでブロックされます。
プロジェクトの作成
新規プロジェクトを作成します。
- Delphi の場合は、[ファイル|新規作成|マルチデバイス アプリケーション - Delphi|空のアプリケーション]を選択します。
- C++Builder の場合、[ファイル|新規作成|マルチデバイス アプリケーション - C++Builder|空のアプリケーション]を選択します。
コンポーネントの追加
- フォームに TButton コンポーネントを 2 つ追加します。
- 最初のボタンの Text プロパティを「Start Future String」に設定します。このボタンによりフューチャが開始されます。
- もう 1 つのボタンの Text プロパティを「Request Future String」に設定します。このボタンは結果を要求するためのものです。
TTask.Future 機能の実装
まず、[Start Future String]ボタンおよび[Request Future String]ボタンの OnClick イベントのイベント ハンドラを実装します。 次のコードを記述します。
Delphi では、関数が無名メソッドとして TTask.Future に渡されます。
procedure TForm1.Button1Click(Sender: TObject);
begin
FutureString:= TTask.Future<string>(
function:string
begin
{Some calculation that takes time}
Sleep(3000);
Result:='Hello ' + Random(42).ToString;
end);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Button2.Text := FutureString.Value;
end;
void __fastcall TForm1::Button1Click(TObject *Sender){
FutureString = TTask::Future<System::String>(0, this->FutureHandler);
}
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));
}
void __fastcall TForm1::Button2Click(TObject *Sender){
Button2->Text = FutureString->Value;
}
次に、以下の宣言を追加します。
public
{ Public declarations }
FutureString: IFuture<string>;
public: // User declarations
System::DelphiInterface<IFuture__1<System::String> > FutureString;
System::String __fastcall FutureHandler(TObject* Sender);
最後に、必要なライブラリもコードに含める必要があります。
Delphi アプリケーションの場合、次のユニットが uses 句に含まれていなければ追加します。
uses
System.Threading;
C++ アプリケーションの場合、プロジェクト ヘッダー ファイルに以下の include 演算子を追加します。
#include <System.Threading.hpp>
アプリケーションの実行
この時点で、アプリケーションを実行することができます。
F9
キーを押すか、[実行|実行]を選択します。
[Start Future String]を押すと手続きが実行され、[Request Future String]を押すと結果を取得できます。値がまだ計算されていない場合には、計算が済むのを待たされることがわかります。済んでいれば、結果はすぐに表示されます。