主要内容

通过在后台运行计算来创建响应式应用程序

本主题展示如何通过使用后台池使应用程序反应更快。通常,MATLAB®在运行计算时暂停执行。当MATLAB被挂起时,您无法中断应用程序。为了使您的应用程序反应更快,请使用后台池在后台运行计算。当MATLAB在后台运行计算时,您的应用程序可以立即响应用户界面交互。

如果要修改在后台运行代码的现有应用程序,请参见计算和绘制简单曲线的响应式应用程序

在这个话题中,你:

  • 打开一个没有在后台运行任何代码的现有应用程序。

  • 修改一个函数以允许应用程序在后台运行代码。

  • 编写一个函数,在代码在后台运行完成后自动更新绘图。

  • 修改现有的回调,以允许应用程序立即响应用户界面交互并中断计算。

Open App Designer App

本例中使用的应用程序允许您选择一个函数,然后计算和绘图y-轴数据取决于内置x设在数据。

文件的工作副本。使用实例PlotCurve应用程序。

openExample (“matlab / PlotCurveAppExample”

在修改和重新组织应用程序代码时,使用此应用程序作为起点。该应用程序有五个功能:

  • getFunction—从下拉菜单中选择fcnDropDown选择一个函数fcn.可作为支持文件使用的自定义函数金宝app暂停(rand)模拟一个非平凡的计算。

  • createData——使用getFunction得到一个函数fcn,然后使用该函数进行计算Y = fcn(x)的迭代中循环。的-loop暂停MATLAB的执行,直到它完成。

  • updatePlot-更新代表的情节app.UIAxes与每个y-轴数据点。

  • clearPlot-清理剧情。

  • toggleButtons—切换是否启用开始按钮或停止按钮。

通过选择编辑代码代码视图在应用程序设计器窗口。

添加一个未来数组的属性

当您在后台运行一个函数时,您将创建一个未来对象。方法获取输出未来对象使用fetchOutputs

为了让你的应用程序响应,你需要存储所有的未来应用程序创建的对象。然后,你可以使用取消当应用程序的用户单击时停止在后台运行的计算停止按钮或使用下拉菜单fcnDropDown

来存储未来对象,您必须添加一个私有属性到您的应用程序。在应用程序设计器工具条中,单击财产>私有财产,然后为属性命名F

属性(Access = private%行对象X% x轴数据F%计算期货结束

创建y-axis后台数据

createData函数创建y-轴数据,当应用程序的用户单击开始按钮。编辑函数以计算y-轴数据在后台。

  1. 使用parfeval(并行计算工具箱)而且backgroundPool运行函数fcn在背景里。在每次迭代中-loop,存储每个未来在数组中f

  2. 将未来数组存储为F属性。

  3. 使用afterEach运行一个函数onFutureDone的每个元素之后更新一个情节app.F完成。指定PassFuture作为真正的使用each来运行函数未来元素。

  4. 使用毕竟之间切换开始而且停止按钮在MATLAB完成所有的计算后y设在数据。

函数createData(应用)为x轴和y轴创建数据。在创建数据时更新一个图。% Get函数fcn = app.getFunction;% x轴数据app.X = 5 * 1:100;% y轴数据i = 1:数值(app.X)%在后台执行fcn(x)命令f(i) = parfeval(backgroundPool,fcn,1,app.X(i));结束存储Future数组app.F = f;在每个Future完成后更新plotafterEach (app.F @app.onFutureDone, 0, PassFuture = true);在所有Future对象完成后切换按钮毕竟(app.F @ app.toggleButtons (~), 0);结束

后台计算数据后自动更新绘图

创建一个新函数,在每次绘图后自动更新绘图未来完成。

  1. 在“应用程序设计器”工具栏中,单击函数>私有函数,然后给函数命名onFutureDone

  2. 如果未来对象结束时发生错误,立即从函数返回。

  3. 如果未来对象未结束时出现错误,请使用ID的属性f求元素的下标f在数组中app.F.的索引未来对象f必须匹配索引的x-轴数据点。

  4. 用的结果更新情节f以及匹配x-轴数据点通过,使用索引idx

函数onFutureDone (app, f)如果有错误,不更新绘图如果~ isempty (f.Error)返回结束找到这个未来的指数idx = [app.F.]ID] == f.d ID);使用结果更新绘图app.updatePlot (fetchOutputs (f)、idx);结束

使你的应用程序更敏感的取消未来数组

为了使你的应用程序反应更快,编辑回调取消未来数组app.F后:

  • 使用下拉菜单更改值fcnDropDown

    函数fcnDropDownValueChanged(应用程序、事件)%止损期货如果~ isempty (app.F)取消(app.F)结束app.clearPlot如果app.StartButton.Enable == false app.createData . enable == false结束结束
  • 推动停止按钮。

    函数StopButtonPushed(应用程序、事件)%止损期货如果~ isempty (app.F)取消(app.F)结束app.toggleButtons结束
  • 请求关闭应用程序。

    函数UIFigureCloseRequest(应用程序、事件)%止损期货如果~ isempty (app.F)取消(app.F)结束删除(应用)结束

计算和绘制简单曲线的响应式应用程序

这个例子展示了一个计算和绘制简单曲线的应用程序。你可以选择一个函数来绘图,然后绘制该函数。该应用程序使用-loop来计算y-轴数据在后台。MATLAB在计算数据时不会暂停执行,因此您可以在计算数据时停止应用程序或更新绘图类型。

运行PlotCurveBackground应用程序,点击运行按钮在应用程序设计器。

另请参阅

||

相关的话题