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);
