прервать функцию обратного вызова TCP-IP в matlab - PullRequest
0 голосов
/ 12 ноября 2018

Недавно написал код, который устанавливает связь между двумя экземплярами matlab. Я могу отправлять сообщения через соединение TCP-IP, которое будет выполнять код. Сейчас я пытаюсь настроить код на прерывание, так как я хотел бы запустить / остановить функцию через TCP-IP. Проблема в том, что отправка второй команды ничего не делает, пока функция не будет завершена. Есть ли способ прервать функцию обратного вызова TCP-IP?

код:

classdef connectcompstogether<handle
    properties
        serverIP
        clientIP
        tcpipServer
        tcpipClient
        Port = 4000;
        bsize = 8;

        earlystop
    end

    methods
        function gh = connectcompstogether(~)
            %           gh.serverIP = '127.0.0.1';
            gh.serverIP = 'localhost';
            gh.clientIP = '0.0.0.0';
        end

        function SetupServer(gh)
            gh.tcpipServer = tcpip(gh.clientIP,gh.Port,'NetworkRole','Server');
            set(gh.tcpipServer,'OutputBufferSize',gh.bsize);
            fopen(gh.tcpipServer);
            display('Established Connection')
        end

        function SetupClient(gh)
            gh.tcpipClient = tcpip(gh.serverIP,gh.Port,'NetworkRole','Client');
            set(gh.tcpipClient, 'InputBufferSize',gh.bsize);
            set(gh.tcpipClient, 'BytesAvailableFcnCount',8);
            set(gh.tcpipClient, 'BytesAvailableFcnMode','byte');
            set(gh.tcpipClient, 'BytesAvailableFcn', @(h,e)gh.recmessage(h,e));
            fopen(gh.tcpipClient);
            display('Established Connection')
        end
        function CloseClient(gh)
            fclose(gh.tcpipClient);
            gh.tcpipClient = [];
        end
    end
    methods
        function sendmessage(gh,message)
            fwrite(gh.tcpipServer,message,'double');
        end

        function recmessage(gh,h,e)
            Message = fread(gh.tcpipClient,gh.bsize/8,'double');

            if Message == 444
                gh.Funwithnumbers();
            elseif Message == 777
                gh.earlystop = 1;
            end
        end

        function Funwithnumbers(gh)
            x=1;
            while true
                if x > 5000, break;end
                if gh.earlystop == 1,break;end
                x = x+1;
                display(x)
            end

        end
    end
end

для простоты понимания кода.

Сервер

Ser = connectcompstogether;
ser.SetupServer();
ser.sendmessage(333);

Клиент

cli = connectcompstogether;
cli.SetupClient();

Обновление: Итак, пройдя через Интернет, я обнаружил, основываясь на этом post , что обратный вызов tcpip не может быть прерван. Сообщение было в 2017 году, что означает, что моя версия 2016a определенно не может прервать обратный вызов.

Итак, обновление моего вопроса: можно ли запустить подпроцесс в matlab для запуска функции. Я просто хочу использовать обратный вызов для запуска кода. Если я могу запустить подпроцесс из обратного вызова. Чем я смогу освободить основной процесс и использовать tcpip для запуска / остановки функции на другом компьютере.

Обновление 2: Поэтому я попытался использовать параллельную обработку с помощью команды «spmd», но проблема все еще сохранялась.

    function recmessage(gh,h,e)
        Message = fread(gh.tcpipClient,gh.bsize/8,'double');

        spmd
            switch labindex
                  case 1
                        if Message == 444
                             gh.Funwithnumbers();
                        elseif Message == 777
                             gh.earlystop = 1;
                       end
            end
       end
    end

1 Ответ

0 голосов
/ 14 ноября 2018

Вы можете использовать объект timer, который удобен для задержки выполнения некоторой функции.

t=timer('ExecutionMode','singleShot', 'StartDelay',0, 'TimerFcn',@myCallback);
start(t);

В этом случае StartDelay равен 0, поэтому myCallback будет почтинемедленно добавляется в очередь задач для обработки Matlab.Однако выполнение начнется только после завершения обратного вызова к объекту tcpip.Однако она заблокирует очередь после запуска.

Вы можете попробовать что-то вроде:

properties
    t=timer('ExecutionMode','singleShot', 'StartDelay',0, 'TimerFcn',@myCallback);
end

function tcpipCallback(gh,tcpObj,~)
message=fread(tcpObj,1,'double');
if message==444
   if strcmp(get(t,'Running'),'on')
     error('The function is running already');
   else
     set(gh.t,'UserData',false);
     start(gh.t);
   end
elseif message==777
   set(gh.t,'UserData',true);
end

function myCallback(tObj,~)
   ii=0;
   while ii<5000
     if get(tObj,'UserData'),break,end
     ii=ii+1;
     pause(.0001); %Pause to interrupt the callback; drawnnow might work too; or perhaps this is not needed at all.
   end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...