Эта тема показывает, как сделать приложение более быстро реагирующим при помощи фонового пула. Обычно, MATLAB® приостанавливает выполнение при выполнении вычислений. В то время как MATLAB приостановлен, вы не можете прервать приложение. Чтобы сделать ваши приложения более быстро реагирующими, используйте фоновый пул, чтобы выполнить вычисления в фоновом режиме. Когда MATLAB выполняет вычисления в фоновом режиме, ваше приложение может сразу ответить на взаимодействия пользовательского интерфейса.
Если вы хотите изменить существующее приложение, которое запускает код в фоновом режиме, см. Быстро реагирующее Приложение, Которое Вычисляет и Графики Простые Кривые.
В этой теме, вас:
Откройте существующее приложение, которое не запускает кода в фоновом режиме.
Измените функцию, чтобы позволить приложению запускать код в фоновом режиме.
Запишите функцию, чтобы автоматически обновить график после того, как код закончит запускаться в фоновом режиме.
Измените существующие коллбэки, чтобы позволить вашему приложению сразу отвечать на взаимодействия пользовательского интерфейса и вычисления прерывания.
Приложение, которое вы используете в этом примере, позволяет вам выбирать функцию, затем вычислять и строить y
- данные об оси в зависимости от встроенного x
- данные об оси.
Запустите эту команду, чтобы открыть рабочую копию PlotCurve
приложение.
openExample('matlab/PlotCurveAppExample')
Используйте это приложение в качестве начальной точки, как вы изменяете и реорганизовываете код приложения. Приложение имеет пять функций:
getFunction
— Используйте значение от выпадающего fcnDropDown
выбрать функциональный fcn
. Пользовательские функции, доступные как вспомогательные файлы, используют pause(rand)
симулировать нетривиальное вычисление.
createData
— Используйте getFunction
получить функциональный fcn
, затем используйте эту функцию, чтобы вычислить y = fcn(x)
в итерациях for
- цикл. for
- цикл приостанавливает выполнение MATLAB, пока это не закончено.
updatePlot
— Обновите график, представленный app.UIAxes
с каждым y
- точка данных оси после того, как это вычисляется.
clearPlot
— Очистите график.
toggleButtons
— Переключитесь между включением кнопки Start или кнопки Stop.
Отредактируйте код путем выбора Code View в окне App Designer.
Future
Массив к свойствамКогда вы запускаете функцию в фоновом режиме, вы создаете Future
объект. Можно выбрать выходные параметры от Future
объектное использование fetchOutputs
.
Чтобы сделать ваше приложение быстро реагирующим, необходимо сохранить весь Future
возражает, что приложение создает. Затем можно использовать cancel
остановить вычисления, запускающиеся в фоновом режиме, когда пользователь приложения нажимает кнопку Stop или использует выпадающий fcnDropDown
.
Сохранить Future
возражает, что приложение создает, необходимо добавить частную собственность в приложение. В панели инструментов App Designer нажмите Property> Private Property, затем назовите свойство F
.
properties (Access = private) h % Line object X % x-axis data F % Futures for calculation end
y
- данные об оси в фоновом режиме createData
функция создает y
- данные об оси, когда пользователь приложения нажимает кнопку Start. Отредактируйте функцию, чтобы вычислить y
- данные об оси в фоновом режиме.
Использование parfeval
(Parallel Computing Toolbox) и backgroundPool
запускать функцию fcn
в фоновом режиме. В каждой итерации for
- цикл, сохраните каждый Future
в массиве f
.
Сохраните будущий массив как F
свойство приложения.
Использование afterEach
запускать функцию onFutureDone
это обновляет график после каждого элемента app.F
завершается. Задайте PassFuture
как true
запускать функцию с помощью каждого Future
элемент.
Использование afterAll
чтобы переключиться между кнопками Start и Stop после, MATLAB закончил вычислять весь y
- данные об оси.
function createData(app) % Create data for the x-axis and y-axis. % Update a plot while the data is being created. % Get function fcn = app.getFunction; % x-axis data app.X = 5 * 1:100; % y-axis data for i = 1:numel(app.X) % Run fcn(x) in the background f(i) = parfeval(backgroundPool,fcn,1,app.X(i)); end % Store the Future array app.F = f; % Update the plot after each Future finishes afterEach(app.F,@app.onFutureDone,0,PassFuture=true); % Toggle the buttons after all Future objects finish afterAll(app.F,@(~)app.toggleButtons,0); end
Создайте новую функцию, чтобы автоматически обновить график после каждого Future
концы.
В панели инструментов App Designer нажмите Function> Private Function, затем назовите функцию onFutureDone
.
Если Future
объект, законченный с ошибкой, сразу возвратитесь из функции.
Если Future
объект не закончился с ошибкой, использует ID
свойство f
найти индекс элемента f
в массиве app.F
. Индекс Future
объект f
должен совпадать с индексом x
- точка данных оси.
Обновите график с результатом f
и соответствующий x
- точка данных оси, с помощью индекса idx
.
function onFutureDone(app,f) % Do not update the plot if there was an error if ~isempty(f.Error) return end % Find the index of this future idx = ([app.F.ID] == f.ID); % Update the plot using the result app.updatePlot(fetchOutputs(f),idx); end
Future
МассивЧтобы сделать ваше приложение более быстро реагирующим, коллбэки редактирования отменяют Future
массив app.F
после вас:
Измените значение с помощью выпадающего fcnDropDown
.
function fcnDropDownValueChanged(app, event) % Stop futures if ~isempty(app.F) cancel(app.F) end app.clearPlot if app.StartButton.Enable == false app.createData end end
Нажмите на кнопку Stop.
function StopButtonPushed(app, event) % Stop futures if ~isempty(app.F) cancel(app.F) end app.toggleButtons end
Запросите приложение закрыться.
function UIFigureCloseRequest(app, event) % Stop futures if ~isempty(app.F) cancel(app.F) end delete(app) end
Этот пример показывает приложение, которое вычисляет и строит простые кривые. Можно выбрать функцию, чтобы построить, затем построить эту функцию. Приложение использует for
- цикл, чтобы вычислить y
- данные об оси в фоновом режиме. MATLAB не приостанавливает выполнение при вычислении данных, и поэтому вы можете остановить приложение или обновить тип графика, в то время как данные вычисляются.
Запустите PlotCurveBackground
приложение путем щелкания по кнопке Run в App Designer.