Exiting form readline() in TCPIP server before timeout occurs

조회 수: 5 (최근 30일)
Vincenzo Genovese
Vincenzo Genovese 2023년 2월 18일
댓글: chrisw23 2023년 2월 21일
I am using the App Designer to develop a TCPIP server (OS: Windows 11). I have to receive command strings from a remote Cient but I must be free at any moment to stop the server and exit from the app by using a specific button: STOPbutton. This is my code:
%Code that executes after component creation
function startupFcn(app)
app.myServer = tcpserver("::",4000,"Timeout",1000);
configureTerminator(app.myServer,"CR")
while(1) % Infinite loop
try
command = readline(app.myServer); % A command string is received
% The command is parsed
%
%
end
end
% Button pushed function: StopButton
function STOPButtonPushed(app, event)
clear app.myServer
app.delete
end
Debugging the script in the App Designer pushing the STOPbutton (before the 1000 secs timeout expires) the result is not the expected one. The UIfigure user interface closes but the debugging session doesn't stop and the only way to restart the session is by using a ctrl-C in the Matlab command window.
This is the message i am getting in the command window:
Operation terminated by user during matlabshared.asyncio.internal.Stream/wait
In matlabshared.transportlib.internal.asyncIOTransportChannel.AsyncIOTransportChannel/waitForDataAvailable
In matlabshared.transportlib.internal.asyncIOTransportChannel.AsyncIOTransportChannel/readUntil
In matlabshared.transportlib.internal.GenericTransport/readUntil
In matlabshared.transportclients.internal.StringClient.StringClient/readRaw
In matlabshared.transportclients.internal.StringClient.StringClient/read
In matlabshared.transportlib.internal.client.ClientImpl/readline (line 139)
data = read(obj.StringClient, precision);
In matlabshared.transportlib.internal.client.GenericClient/readline (line 631)
data = readline(obj.ClientImpl, varargin{:});
In tcpserver.internal.TCPServer/readline (line 595)
data = readline(obj.Client,varargin{:});
In Mat_server_app/startupFcn (line 37)
command = readline(app.myServer);
In matlab.apps.AppBase/runStartupFcn (line 69)
ams.runStartupFcn(app, startfcn);
In Mat_server_app (line 149)
runStartupFcn(app, @startupFcn)
It seems that by deleting the tcpserver object the readline function is not terminated and some process remains active.
By compiling a Standalone Destktop App and running the App the anomaly has been confirmed. By pushing the STOPbutton the UIfigure user interface closes but a the process related to the App is always running (as reported by the by the Windows 11 task manager ). The only way to restart the server is to kill such process in the task manager.
Any idea about how to force the readline process to end before its timeout expires ?

답변 (1개)

chrisw23
chrisw23 2023년 2월 20일
편집: chrisw23 2023년 2월 20일
try to implement the BytesAvailableFcn callback before starting the readline function
flush the buffer and delete ther server when the app will be closed
  댓글 수: 2
Vincenzo Genovese
Vincenzo Genovese 2023년 2월 21일
It is not clear to me the role of BytesAvailableFcn callback. What exactly should the callaback do since I'm interested in reading a string by the readline()? Please, take in account that I used: configureTerminator(app.myServer,"CR").
chrisw23
chrisw23 2023년 2월 21일
You call readline() without knowing if there's any data to be read and this probably results in wait/timeout state. This may be the effect you see when trying to close your app.

댓글을 달려면 로그인하십시오.

태그

제품


릴리스

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by