multiple cprintf in parallel loop problem

I want to print a secetence with different color in the command windows using 'cprintf':
https://www.mathworks.com/matlabcentral/fileexchange/24093-cprintf-display-formatted-colored-text-in-the-command-window
below are the test code:
q = parallel.pool.DataQueue;
afterEach(q, @(args) cprintf(args{:}));
parfor i=1:1:100
tic
pause(0.5)
time1=toc;
fprintf(', Reading time:'); send(q,{'Keywords','%4.1f',time1}); fprintf(' seconds,')
end
the code runs OK using regular for-loop, but once I changed it into parfor, the printed result are chaos, this may be caused by the combination of fprintf-cprintf-fprintf.
is there anyway to solve this problem?
Thanks!
Yu

 Accepted Answer

To stop the output being interleaved, you need to send all the stuff to be printed as a single message. Here's one way:
q = parallel.pool.DataQueue;
afterEach(q, @multiCprintf);
parfor i=1:1:100
tic
pause(0.5)
time1=toc;
% Send multiple sets of things to print in a cell-of-cells
send(q, {...
{'Reading time: '}, ...
{'Keywords', '%4.1f', time1}, ...
{' seconds\n'}});
end
function multiCprintf(argsCell)
% loop over the outer layer of cells, and call cprintf on
% the inner layers.
for idx = 1:numel(argsCell)
theseArgs = argsCell{idx};
cprintf(theseArgs{:});
end
end

4 Comments

Thanks for your answer.
Really fantastic, I've never seen writing parfor like this before.
Thank you~
Yu
Hi:
sorry to bother you, I met a further question regarding this topic, just a simple question but I do not know if there is any mistake on my code.
below is the test code:
warning off all
q = parallel.pool.DataQueue;
afterEach(q, @multiCprintf);
unit='Second';
send(q,{{'timing: '},{'Keywords','%4.2f',100},{' Seconds\n'}})
send(q,{{'timing: '},{'Keywords','%4.2f',100},{' %s\n',unit}})
function multiCprintf(argsCell)
% loop over the outer layer of cells, and call cprintf on
% the inner layers.
for idx = 1:numel(argsCell)
theseArgs = argsCell{idx};
cprintf(theseArgs{:});
end
end
there are two 'send' in this code, where the unit='Second'. but if you run it, you may see that when I replaced the 'Seconds' with ''%s',unit', the 'Second' is not printed.
I'm not sure if there is any mistake with my code, could you please give me some suggestions?
Thanks!
Yu
I think this is because cprintf has 2 different syntaxes:
1. cprintf(style, format, ...)
2. cprintf(literalText)
In particular, there's no cprintf(format, ...).
So, when you do
cprintf(' %s\n', 'Second')
cprintf is actually throwing an error because ' %s\n' isn't a valid style. You can fix this by using
{'Text', ' %s\n', unit}
which tells cprintf to print in the plain style.

Sign in to comment.

More Answers (0)

Asked:

on 18 Sep 2018

Commented:

on 20 Sep 2018

Community Treasure Hunt

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

Start Hunting!