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