Search code examples
matlabparallel-processingnamed-pipesmatlab-app-designer

How to run NamedPipe stream under parforloop in MatLab Appdesigner


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

Solution

  • 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