afterEach
と afterAll
を使用したユーザー インターフェイスの非同期更新
この例では、計算の完了時にユーザー インターフェイスを更新する方法を説明します。parfeval
を使用して計算をワーカーにオフロードすると、ワーカーが計算を実行中にすべてのユーザー インターフェイスが応答可能な状態になります。waitbar
を使用すると単純なユーザー インターフェイスを作成できます。
それぞれの計算が完了するたびにユーザー インターフェイスを更新するには、
afterEach
を使用します。すべての計算が完了した後にユーザー インターフェイスを更新するには、
afterAll
を使用します。
waitbar
を使用して Figure ハンドル h
を作成します。afterEach
または afterAll
を使用すると、関数 waitbar
は Figure ハンドルを更新します。ハンドル オブジェクトの詳細については、ハンドル オブジェクトの動作を参照してください。
h = waitbar(0,'Waiting...');
parfeval
を使用して、乱数行列の固有値の実数部を計算します。既定の基本設定では、並列プールがまだ作成されていなければ、parfeval
によって自動的に作成されます。効率性を高めるため、Future
オブジェクトの配列を事前に割り当てます。
f(1:100) = parallel.FevalFuture; for idx = 1:100 f(idx) = parfeval(@(n) real(eig(randn(n))),1,5e2); end
afterEach
を使用して、parfeval
の各計算結果に対して自動的に関数を呼び出すことができます。f
内の各 future が完了するたびに、afterEach
を使用して別の future オブジェクトのセットをスケジュールし、各出力配列内の最大値を計算します。
maxFuture = afterEach(f,@max,1);
State
プロパティを使用して、future のステータスを取得できます。ウェイト バー h
の割合の長さを、実行が終了した Future
オブジェクトの割合に更新する無名関数を定義します。無名関数 updateWaitbar
は、f
の対応する Future
オブジェクトの State
プロパティが "finished"
の場合に要素が true
である logical 配列の平均値を計算します。
updateWaitbar = @(~) waitbar(mean({f.State} == "finished"),h);
maxFuture
の各 future が完了するたびに、afterEach
と updateWaitbar
を使用してウェイト バーの割合の長さを更新します。すべての計算が完了したら、afterAll
と delete
を使用してウェイト バーを閉じます。
updateWaitbarFutures = afterEach(f,updateWaitbar,0); afterAll(updateWaitbarFutures,@(~) delete(h),0)
すべての future が完了したら、afterAll
と histogram
を使用して maxFuture
の結果のヒストグラムを表示します。
showsHistogramFuture = afterAll(maxFuture,@histogram,0);