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

 Respuesta aceptada

Edric Ellis
Edric Ellis el 19 de Sept. de 2018
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 comentarios

Yu Li
Yu Li el 19 de Sept. de 2018
Thanks for your answer.
Really fantastic, I've never seen writing parfor like this before.
Thank you~
Yu
Yu Li
Yu Li el 19 de Sept. de 2018
Editada: Walter Roberson el 19 de Sept. de 2018
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.
Yu Li
Yu Li el 20 de Sept. de 2018
Thank you!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Preguntada:

el 18 de Sept. de 2018

Comentada:

el 20 de Sept. de 2018

Community Treasure Hunt

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

Start Hunting!

Translated by