Multithreading 停止TIdTCPServer时线程超时

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

当我试图停止我的TIdTCPServer时,我得到了一个EIdTerminateThreadTimeout。我猜这是因为连接的客户端没有关闭

我对Indy的工作有点迷茫,什么是停止服务器创建的所有线程的正确方法?是否有任何特定的顺序,我应该停止线程,清除绑定并关闭活动标志

这是我的服务器端清理代码

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上。