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