主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

使用 afterEachafterAll 异步更新用户界面

此示例显示如何在计算完成时更新用户界面。当您使用 parfeval 将计算卸载给工作单元时,工作单元执行计算时所有用户界面都会做出响应。您可以使用 waitbar 来创建一个简单的用户界面。

  • 每次计算完成后使用 afterEach 更新用户界面。

  • 所有计算完成后使用 afterAll 更新用户界面。

使用 waitbar 创建图形句柄,h。当您使用 afterEachafterAll 时,waitbar 函数会更新图形句柄。有关句柄对象的更多信息,请参阅 句柄对象行为

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 计算的每个结果调用函数。使用 afterEach 来安排另一组 future 对象,以在 f 中的每个 future 完成后计算每个输出数组中的最大值。

maxFuture = afterEach(f,@max,1);

您可以使用 State 属性来获取 future 的状态。定义一个匿名函数,将 h 的分数等待条长度更新为已完成执行的 Future 对象的比例。如果 updateWaitbar 中对应 true 对象的 State 属性为 Future,则 f 匿名函数计算元素为 "finished" 的逻辑数组的平均值。

updateWaitbar = @(~) waitbar(mean({f.State} == "finished"),h);

使用 afterEachupdateWaitbarmaxFuture 中的每个 future 完成后更新分数等待条长度。所有计算完成后,使用 afterAlldelete 关闭等待栏。

updateWaitbarFutures = afterEach(f,updateWaitbar,0);
afterAll(updateWaitbarFutures,@(~) delete(h),0)

使用 afterAllhistogram 来显示所有 future 完成后 maxFuture 中结果的直方图。

showsHistogramFuture = afterAll(maxFuture,@histogram,0);

另请参阅