Multithreading 停止TIdTCPServer时线程超时
当我试图停止我的TIdTCPServer时,我得到了一个EIdTerminateThreadTimeout。我猜这是因为连接的客户端没有关闭 我对Indy的工作有点迷茫,什么是停止服务器创建的所有线程的正确方法?是否有任何特定的顺序,我应该停止线程,清除绑定并关闭活动标志 这是我的服务器端清理代码Multithreading 停止TIdTCPServer时线程超时,multithreading,delphi,indy,Multithreading,Delphi,Indy,当我试图停止我的TIdTCPServer时,我得到了一个EIdTerminateThreadTimeout。我猜这是因为连接的客户端没有关闭 我对Indy的工作有点迷茫,什么是停止服务器创建的所有线程的正确方法?是否有任何特定的顺序,我应该停止线程,清除绑定并关闭活动标志 这是我的服务器端清理代码 procedure TPassiveConnection.StopServer; begin { Si el servidor ya está a la escucha es porque m
procedure TPassiveConnection.StopServer;
begin
{ Si el servidor ya está a la escucha es porque me he suscrito
de forma satisfactoria en el gateway }
if( ListenerServer.Active ) then
begin
SendUnsubscribeMessage();
end;
ListenerServer.Active := false;
ListenerServer.Bindings.Clear;
end;
设置活动标志后,我将获得EIDTTerminateThreadTimeout
这是服务器处理程序
{ Se ha abierto la conexión }
procedure TPassiveConnection.tsConnect(AThread: TIdPeerThread);
begin
AnotarMensaje(odDepurar, 'Recibida conexión entrante' );
end;
{
Este manejador se invoca cada vez que se ponen datos en el socket
Se leen esos datos y se invoca el comando enviado
}
procedure TPassiveConnection.tsExecute(AThread: TIdPeerThread);
var
Command: string;
begin
Command := AThread.Connection.ReadLn;
if Command <> '' then
begin
ExecuteRemoteCommand( Command );
end;
end;
{ Se ha cerrado la conexión }
procedure TPassiveConnection.tsDisconnect(AThread: TIdPeerThread);
begin
AnotarMensaje(odDepurar, 'Cerrando puerto de escucha' );
AThread.Connection.Disconnect;
AThread.Terminate();
end;
{ Se ha producido un error durante la conexión }
procedure TPassiveConnection.tsException(AThread: TIdPeerThread; AException: Exception);
begin
AnotarMensaje(odDepurar, 'Excepción capturada en conexión entrante' + AException.Message );
end;
{Se ha abierto la conexión}
程序TPassiveConnection.tConnection(AThread:TIdPeerThread);
开始
AnotarMensaje(odDepurar,“Recibida conexión entrante”);
结束;
{
埃斯特·曼内贾多尔(Este manejador)是一位来自世界各地的女性
我的名字是datos和invoca el-comando enviado
}
程序TPassiveConnection.tExecute(AThread:TIdPeerThread);
变量
命令:字符串;
开始
命令:=AThread.Connection.ReadLn;
如果命令为“”,则
开始
ExecuteMoteCommand(命令);
结束;
结束;
{塞尔拉多拉科内西翁}
程序TPassiveConnection.tsDisconnect(AThread:tIPpeerThead);
开始
AnotarMensaje(odDepurar,Cerrando puerto de escucha');
AThread.Connection.Disconnect;
AThread.Terminate();
结束;
{这是一个错误的产品}
过程TPassiveConnection.tException(AThread:TIdPeerThread;aeException:Exception);
开始
AnotarMensaje(odDepurar,'Excepción capturada en conexión entrante'+AEException.Message);
结束;
我尝试在断开连接处理程序中调用Terminate方法,但我一直遇到异常。超时意味着客户端线程很可能已死锁,根本没有终止。
AnotarMensaje()
和executeemotecommand()
看起来像什么?它们是线程安全的吗?至于OnDisconnect
事件,它是在客户端线程正在停止时触发的,因此不需要在其中调用Disconnect()
或Terminate()
。谢谢,雷米!我发现我的问题就在那里,在Txecute上。