I am developing a software in matlab appdesigner that will run two functions simultaneously under parforloop. The first function has a NamedPipe object and the error is: Functionality not supported with figures created with the uifigure function for the app variable and also unable to load .Net object . What's the problem with NamedPipe object under parforloop? How can i run namedpipe communication with parallelism in matlab appdesigner? Here is my code
function func1(app)
%disp('Function 1');
disp(strcat('Function 1----',datestr(now)));
pause(2);
disp(strcat('Function 1----',datestr(now)));
NET.addAssembly('System.Core');
MypipeServer = System.IO.Pipes.NamedPipeServerStream('my_pipe', ...
System.IO.Pipes.PipeDirection.InOut, ...
System.IO.Pipes.NamedPipeServerStream.MaxAllowedServerInstances,...
System.IO.Pipes.PipeTransmissionMode.Byte,...
System.IO.Pipes.PipeOptions.Asynchronous);
disp("Waiting for client connection...");
MypipeServer.WaitForConnection();
disp("Client Connected");
disp('Reading data from Client');
pause(2);
sr = System.IO.StreamReader(MypipeServer);
%sw = System.IO.StreamWriter('E:/pipeKo.txt')
line = sr.ReadLine();
disp(line);
end
function func2(app)
%disp('Function 2');
disp(strcat('Function 2----',datestr(now)));
pause(2);
disp(strcat('Function 2----',datestr(now)));
end
function ClickOnButtonValueChanged(app, event)
parfor i = 1:2
if i == 1
func1(app);
else
func2(app);
end
end
end
Finally, I have found the solution. So i am posting the answer for future help. parallel.pool.DataQueue should be used here. Here is the full code of appdesigner. For Full Server and Client code you can also check this github repository: Named Pipe Parallel Communication
methods (Access = private)
function app= func1(app,data)
disp(strcat('Function 1----',datestr(now)));
app.textTextArea.Value=strcat('Function 1----',datestr(now));
pause(5);
disp(strcat('Function 1----',datestr(now)));
NET.addAssembly('System.Core');
MypipeServer = System.IO.Pipes.NamedPipeServerStream('my_pipe', ...
System.IO.Pipes.PipeDirection.InOut, ...
System.IO.Pipes.NamedPipeServerStream.MaxAllowedServerInstances,...
System.IO.Pipes.PipeTransmissionMode.Byte,...
System.IO.Pipes.PipeOptions.Asynchronous);
disp("Waiting for client connection...");
app.textTextArea.Value=[app.textTextArea.Value;"Waiting for client connection..."];
pause(1);
MypipeServer.WaitForConnection();
disp("Client Connected");
app.textTextArea.Value=[app.textTextArea.Value;"Client Connected"];
disp('Reading data from Client');
app.textTextArea.Value=[app.textTextArea.Value;"Reading data from Client"];
pause(1);
sr = System.IO.StreamReader(MypipeServer);
line = sr.ReadLine();
disp(string(line));
app.textTextArea.Value=[app.textTextArea.Value;string(line)];
pause(2);
sw = System.IO.StreamWriter(MypipeServer);
%sw.AutoFlush = true;
time = datestr(now);
disp(time);
app.textTextArea.Value=[app.textTextArea.Value;time];
disp("Server: Hello");
app.textTextArea.Value=[app.textTextArea.Value;"Server: Hello"];
sw.WriteLine("Hello");
sw.Flush();
app.textTextArea.Value=[app.textTextArea.Value;strcat('After Communication----',datestr(now))];
disp(strcat('After Communication----',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