"parfeval" and "backgroundPool" to create background progress bar

13 ビュー (過去 30 日間)
Dear experts, I am trying to cretae a progress bar that runs in background.
My silly progressbar code is:
function [WaitF] = DBWaitGUI2
ScreSize = get(0,'screensize');
ScreSize = ScreSize(3:end);
matBar(:,:,1) = ones(256,256);
matBar(:,:,2) = zeros(256,256);
matBar(:,:,3) = zeros(256,256);
matBarg(:,:,1) = ones(256,256).*0.6;
matBarg(:,:,2) = ones(256,256).*0.6;
matBarg(:,:,3) = ones(256,256).*0.6;
WaitF = figure('Name','','NumberTitle','off','Color',[0.4 0.4 0.4],...
'Position',[ScreSize(1)/2-200 ScreSize(2)/2-50 400 60],...
% undecorateFig(WaitF)
sub1 = subplot('Position',[0.012 0.1 0.08 0.8],'Units','Normalized');
b1 = imagesc(sub1,matBar);
axis off
box off
AChilds.b1 = b1;
sub2 = subplot('Position',[0.12-0.013 0.1 0.08 0.8],'Units','Normalized');
b2 = imagesc(sub2,matBarg);
axis off
box off
AChilds.b2 = b2;
sub3 = subplot('Position',[0.22-0.013 0.1 0.08 0.8],'Units','Normalized');
b3 = imagesc(sub3,matBarg);
axis off
box off
AChilds.b3 = b3;
sub4 = subplot('Position',[0.32-0.013 0.1 0.08 0.8],'Units','Normalized');
b4 = imagesc(sub4,matBarg);
axis off
box off
AChilds.b4 = b4;
sub5 = subplot('Position',[0.42-0.013 0.1 0.08 0.8],'Units','Normalized');
b5 = imagesc(sub5,matBarg);
axis off
box off
AChilds.b5 = b5;
sub6 = subplot('Position',[0.52-0.013 0.1 0.08 0.8],'Units','Normalized');
b6 = imagesc(sub6,matBarg);
axis off
box off
AChilds.b6 = b6;
sub7 = subplot('Position',[0.62-0.013 0.1 0.08 0.8],'Units','Normalized');
b7 = imagesc(sub7,matBarg);
axis off
box off
AChilds.b7 = b7;
sub8 = subplot('Position',[0.72-0.013 0.1 0.08 0.8],'Units','Normalized');
b8 = imagesc(sub8,matBarg);
axis off
box off
AChilds.b8 = b8;
sub9 = subplot('Position',[0.82-0.013 0.1 0.08 0.8],'Units','Normalized');
b9 = imagesc(sub9,matBarg);
axis off
box off
AChilds.b9 = b9;
sub10 = subplot('Position',[0.92-0.013 0.1 0.08 0.8],'Units','Normalized');
b10 = imagesc(sub10,matBarg);
axis off
box off
AChilds.b10 = b10;
while kee == 0
for iu = 1:10
if iu>1
eval(['AChilds.b',num2str(iu-1),'.CData = matBarg;']);
eval(['AChilds.b',num2str(10),'.CData = matBarg;']);
eval(['AChilds.b',num2str(iu),'.CData = matBar;']);
So I am trying:
The progress bar looks fine, but, Matlab is still waiting for the infinite process to end. Any idea of how to solve it? Am I committing any sin?


Raymond Norris
Raymond Norris 2021 年 10 月 19 日
編集済み: Raymond Norris 2021 年 10 月 19 日
There are a couple of issues
  • parfeval requires other input arguments and you need to pass in the function handle to DBWaitGUI2. At the moment, you're calling DBWaitGUI2 directly, rather then delaying it on the background thread.
f = parfeval(backgroundPool,@DBWaitGUI2,1);
This states there's 1 output argument (WaitF), though you don't need to return it (you could give parfeval an input argument of 0). If there were any input arguments to DBWaitGUI2, you provide those after the number of input arguments.
  • But there's a bigger issue here. You need to run the plotting on the main thread, not a threads-based pool or a background thread. Alternatively, you can use a process-based pool. To see this, run the following:
It will complain about get, but this is easy to reproduce with just
f = parfeval(backgroundPool,@plot,1,1:10);
A good example of calculation vs plotting with parfeval is in the documentation
Look at how the waitbar is updated (implicilty on the main thread). With that said, going back to the alternative (using a process-based pool), the plotting will run on a headless worker -- it won't display the GUI on the main thread, as seen here
local = parcluster('local');
pool = local.parpool;
f = pool.parfeval(@plot,1,1:10);
  1 件のコメント
Brunno Machado de Campos
Brunno Machado de Campos 2021 年 10 月 20 日
Thank your, now I see the problems and limitations clearly.


その他の回答 (0 件)


Find more on Background Processing in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by