Обновите пользовательский интерфейс асинхронно Используя afterEach и afterAll

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

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

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

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

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);

Смотрите также