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

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

Создайте простой пользовательский интерфейс с помощью waitbar.

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

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

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

Вычислите самое большое значение в каждом из вычислений, когда они станут готовым использованием afterEach. Обновите пропорцию законченных фьючерсов в waitbar, когда каждый из них завершит использование afterEach.

maxFuture = afterEach(f, @max, 1);
updateWaitbarFuture = afterEach(f, @(~) waitbar(sum(strcmp('finished', {f.State}))/numel(f), h), 1);

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

closeWaitbarFuture = afterAll(updateWaitbarFuture, @(h) delete(h), 0);

Покажите гистограмму после того, как все максимальные значения будут вычислены. Используйте afterAll на maxFuture, чтобы продолжить операцию автоматически. afterAll получает максимальные значения из maxFuture и вызывает histogram на них.

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

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