Update app.textarea inside a parfor loop
이전 댓글 표시
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
채택된 답변
추가 답변 (1개)
Ashadullah Shawon
2019년 7월 19일
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
Alexander Babin
2020년 8월 23일
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
2020년 8월 23일
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
2020년 8월 23일
you might need to add a drawnow call
카테고리
도움말 센터 및 File Exchange에서 Parallel for-Loops (parfor)에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!