Используйте фон, чтобы сделать ваши приложения более быстро реагирующими

Эта тема показывает, как сделать приложение более быстро реагирующим при помощи фонового пула. Обычно, MATLAB® приостанавливает выполнение при выполнении вычислений. В то время как MATLAB приостановлен, вы не можете прервать приложение. Чтобы сделать ваши приложения более быстро реагирующими, используйте фоновый пул, чтобы выполнить вычисления в фоновом режиме. Когда MATLAB выполняет вычисления в фоновом режиме, ваше приложение может сразу ответить на взаимодействия пользовательского интерфейса.

Если вы хотите изменить существующее приложение, которое запускает код в фоновом режиме, см. Быстро реагирующее Приложение, Которое Вычисляет и Графики Простые Кривые.

В этой теме, вас:

  • Откройте существующее приложение, которое не запускает кода в фоновом режиме.

  • Измените функцию, чтобы позволить приложению запускать код в фоновом режиме.

  • Запишите функцию, чтобы автоматически обновить график после того, как код закончит запускаться в фоновом режиме.

  • Измените существующие коллбэки, чтобы позволить вашему приложению сразу отвечать на взаимодействия пользовательского интерфейса и вычисления прерывания.

Приложение Открытия App Designer

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

  1. Использование parfeval (Parallel Computing Toolbox) и backgroundPool запускать функцию fcn в фоновом режиме. В каждой итерации for- цикл, сохраните каждый Future в массиве f.

  2. Сохраните будущий массив как F свойство приложения.

  3. Использование afterEach запускать функцию onFutureDone это обновляет график после каждого элемента app.F завершается. Задайте PassFuture как true запускать функцию с помощью каждого Future элемент.

  4. Использование 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 концы.

  1. В панели инструментов App Designer нажмите Function> Private Function, затем назовите функцию onFutureDone.

  2. Если Future объект, законченный с ошибкой, сразу возвратитесь из функции.

  3. Если Future объект не закончился с ошибкой, использует ID свойство f найти индекс элемента f в массиве app.F. Индекс Future объект f должен совпадать с индексом x- точка данных оси.

  4. Обновите график с результатом 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.