Обновитесь ожидают панель в то время как функции, запущенные в фоновом режиме

В этом примере показано, как использовать afterEach обновить панель ожидания с прогрессом функций, запускающихся в фоновом режиме.

Создайте панель ожидания, w.

w = waitbar(0,'Please wait ...');

Определите номер итераций для вашего for- цикл, N. Сохраните текущее количество завершенных итераций, 0, и общее количество итераций, N, в UserData свойство панели ожидания.

N = 20;
w.UserData = [0 Н];

Запустите for- цикл с N итерации. В каждой итерации используйте parfeval и backgroundPool запускать pause в фоновом режиме для случайного числа секунд. Сохраните каждый Future объект в массиве.

for i = 1:N
    delay = rand;
    f(i) = parfeval(backgroundPool,@pause,0,delay);
end

Используйте функцию помощника updateWaitbar обновить waitbar после каждого Future концы.

afterEach(f,@(~)updateWaitbar(w),0);

Используйте delete закрыть панель ожидания после всего Future конец объектов.

afterAll(f,@(~)delete(w),0);

Задайте функцию помощника

Задайте функцию помощника updateWaitbar. Функция постепенно увеличивает первый элемент UserData свойство, затем использует вектор, чтобы вычислить прогресс.

function updateWaitbar(w)
    % Update a waitbar using the UserData property.

    % Check if the waitbar is a reference to a deleted object
    if isvalid(w)
        % Increment the number of completed iterations 
        w.UserData(1) = w.UserData(1) + 1;

        % Calculate the progress
        progress = w.UserData(1) / w.UserData(2);

        % Update the waitbar
        waitbar(progress,w);
    end
end