Эта тема показывает, как сделать приложение более быстро реагирующим при помощи фонового пула. Обычно, 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.
