Exiting form readline() in TCPIP server before timeout occurs

6 vues (au cours des 30 derniers jours)
Vincenzo Genovese
Vincenzo Genovese le 18 Fév 2023
Commenté : chrisw23 le 21 Fév 2023
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 ?

Réponses (1)

chrisw23
chrisw23 le 20 Fév 2023
Modifié(e) : chrisw23 le 20 Fév 2023
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 commentaires
Vincenzo Genovese
Vincenzo Genovese le 21 Fév 2023
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 le 21 Fév 2023
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.

Connectez-vous pour commenter.

Produits


Version

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by