0

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
shawon
  • 984
  • 7
  • 15

1 Answers1

0

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
shawon
  • 984
  • 7
  • 15