Update app.textarea inside a parfor loop

I'm trying to update app.TextArea in the app designer using parfor_progress
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

 採用された回答

Walter Roberson
Walter Roberson 2018 年 3 月 7 日

0 投票

If you are using a newer release then I would skip all of that and use parallel.pool.DataQueue and send() and afterEach(); see https://www.mathworks.com/help/distcomp/send.html .

その他の回答 (1 件)

Ashadullah Shawon
Ashadullah Shawon 2019 年 7 月 19 日

0 投票

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
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
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
Walter Roberson 2020 年 8 月 23 日
you might need to add a drawnow call

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeDevelop Apps Using App Designer についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by