Как запустить поток NamedPipe под parforloop в MatLab Appdesigner

Я разрабатываю программное обеспечение в конструкторе приложений Matlab, которое будет одновременно запускать две функции под parforloop. Первая функция имеет объект NamedPipe и ошибка: Функциональность не поддерживается фигурами, созданными с помощью функции uifigure для переменной приложения, а также не может загрузить .Net объект . В чем проблема с объектом NamedPipe под parforloop? Как я могу запустить коммуникацию namedpipe с параллелизмом в дизайнере приложений Matlab? Вот мой код

 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

person shawon    schedule 13.07.2019    source источник


Ответы (1)


Наконец, я нашел решение. Поэтому я публикую ответ для будущей помощи. Здесь следует использовать parallel.pool.DataQueue. Вот полный код appdesigner. Для полного кода сервера и клиента вы также можете проверить этот репозиторий github: Параллельная связь с именованным каналом

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
person shawon    schedule 22.07.2019