Это должно сработать.Убедитесь, что вы переместили функцию completeJobs в ее собственный сценарий, в противном случае функция clear в строке 1 не будет работать.
clear completedJobs
dq = parallel.pool.DataQueue;
wb = waitbar(0,'Processing');
Listener = afterEach(dq, @(varargin) waitbar((completedJobs/100),wb,sprintf('Completed: %d', completedJobs(1))));
parfor i=1:100
send(dq, i);
end
delete(wb);
Поскольку функция завершено, вызывается дважды для каждого прослушиваемого события, в котором требуется переключение.функция, гарантирующая, что n увеличивается только один раз.Это делается путем передачи фиктивного ввода в completeJobs
function j = completedJobs(varargin)
persistent n
if isempty(n)
n = 0;
end
if numel(varargin) ~=0
else
n = n+1;
end
j=n;
end