最近编写的代码在两个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
答案 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