中断matlab中的TCP-IP回调函数

时间:2018-11-12 17:14:33

标签: matlab tcp

最近编写的代码在两个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 :(得分:0)

您可以使用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