一旦变量接收到数据,我便尝试更新它的值,这样我就可以更新等待栏中的消息以了解已完成多少工作。我的代码如下所示:
function value = completedJobs(value)
value=value+1;
end
job=0;
dq = parallel.pool.DataQueue;
wb = waitbar(0,'Processing');
afterEach(dq, @(varargin) completedJobs(job)) // this is where I would like to update the waitbar with new completed jobs on the message
afterEach(dq, @(varargin) waitbar(job,sprintf('Completed: %d', job));
parfor i=1:100
send(dq, i);
end
是否可以将两次对afterEach
的调用合并为一个可以执行这两个调用所执行的操作?
预先感谢!
答案 0 :(得分:0)
这应该可以解决问题。确保将completedJobs函数移至其自己的脚本,否则第1行的clear函数将无法工作。
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);
因为对于每个侦听事件,completedJobs函数都会被调用两次,因此您需要在函数内进行切换以确保n仅增加一次。这是通过将虚拟输入传递给CompletedJobs
来完成的function j = completedJobs(varargin)
persistent n
if isempty(n)
n = 0;
end
if numel(varargin) ~=0
else
n = n+1;
end
j=n;
end