Update app.textarea inside a parfor loop
Mostrar comentarios más antiguos
Error: Valid indices for 'app' are restricted in PARFOR loops.
How would I fix the sliced variable that is 'app' or is it just impossible with parfor and the app designer?
Using Matlab 2017b
Example code below:
clear;
clc;
num_iter=100;
percent=parfor_progress(num_iter);
parfor i=1:num_iter
pause(randi(10));
percent=parfor_progress;
app.TextArea.Value={percent};
end
parfor_progress(0);
Any help/links for further reading would be helpful.
Thanks
Nick
Respuesta aceptada
Más respuestas (1)
Ashadullah Shawon
el 19 de Jul. de 2019
i am just expanding the accepted answer for the quick understanding. I have uploaded the full appdesigner code and here is also the functions preview using parallel.pool.DataQueue and send() and afterEach()
methods (Access = private)
function app= func1(app,data)
%disp(data);
app.textTextArea.Value = strcat('Function 1----',datestr(now));
%pause(1);
app.textTextArea.Value = [app.textTextArea.Value;strcat('Function 1----',datestr(now))];
end
function app= func2(app,data)
%disp('Function 2');
app.textTextArea.Value = [app.textTextArea.Value;strcat('Function 2----',datestr(now))];
%pause(1);
app.textTextArea.Value = [app.textTextArea.Value;strcat('Function 2----',datestr(now))];
end
end
methods (Access = private)
% Value changed function: ClickOnButton
function ClickOnButtonValueChanged(app, event)
q = parallel.pool.DataQueue;
r = parallel.pool.DataQueue;
afterEach(q, @app.func1);
afterEach(r, @app.func2);
parfor i = 1:2
if i == 1
%func1(app);
send(q,i);
else
%func2(app);
send(r,i);
end
end
end
end
3 comentarios
Alexander Babin
el 23 de Ag. de 2020
Hi, this didn't work for me: I'm trying to display iteration number each time parfor runs a loop, but it only spits out all messages at once after all of them are compete, not as soon as data.queue receives data it seems
Alexander Babin
el 23 de Ag. de 2020
function sendMessage(app,data)
app.ProgressTextArea.Value=[app.ProgressTextArea.Value;data];
end
message = parallel.pool.DataQueue;
afterEach(message, @(msg) sendMessage(app,msg));
parfor iteration=1:N
...
msg = ['Completed iteration # ', num2str(iteration)];
send(message,msg);
end
Walter Roberson
el 23 de Ag. de 2020
you might need to add a drawnow call
Categorías
Más información sobre Parallel for-Loops (parfor) en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!