Асинхронное обновление интерфейса пользователя с использованием afterEach и afterAll

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

  • Использование afterEach обновлять пользовательский интерфейс после завершения каждого расчета.

  • Использование afterAll обновить пользовательский интерфейс после завершения расчетов.

Использование waitbar чтобы создать указатель на рисунок, h. Когда вы используете afterEach или afterAll, а waitbar функция обновляет указатель на рисунок. Для получения дополнительной информации об указателе объектов смотрите Указатель Объекта Behavior.

h = waitbar(0,'Waiting...');

Использование parfeval вычислить вещественную часть собственных значений случайных матриц. С настройками по умолчанию parfeval автоматически создает параллельный пул, если он еще не создан.

for idx = 1:100
    f(idx) = parfeval(@(n) real(eig(randn(n))),1,5e2); 
end

Можно использовать afterEach для автоматического вызова функций на каждом из результатов parfeval расчеты. Использование afterEach вычислять самое большое значение в каждом из выходных массивов после завершения каждого будущего.

maxFuture = afterEach(f,@max,1);

Можно использовать State свойство для получения статуса фьючерса. Создайте логический массив, где State свойство фьючерсов в f является "finished". Использование mean вычислить долю готовых фьючерсов. Затем создайте анонимную функцию updateWaitbar. Функция изменяет дробную длину полосы ожидания h к части готовых фьючерсов.

updateWaitbar = @(~) waitbar(mean({f.State} == "finished"),h);

Использование afterEach и updateWaitbar чтобы обновить дробную длину полосы ожидания после каждого будущего в maxFuture завершает. Использование afterAll и delete чтобы закрыть панель ожидания после завершения всех расчетов.

updateWaitbarFutures = afterEach(f,updateWaitbar,0);
afterAll(updateWaitbarFutures,@(~) delete(h),0);

Использование afterAll и histogram чтобы показать гистограмму результатов в maxFuture после завершения всех фьючерсов.

showsHistogramFuture = afterAll(maxFuture,@histogram,0);

См. также