Недавно написал код, который устанавливает связь между двумя экземплярами 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