Обновите пользовательский интерфейс асинхронно Используя 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);

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