停止TIdTCPServer时的线程超时

时间:2017-06-13 15:55:18

标签: multithreading delphi indy

当我试图阻止我的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;

设置Active标志后,我得到了EIdTerminateThreadTimeout。

这是服务器处理程序

{ 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;

我尝试在断开处理程序中调用Terminate方法,但我一直收到异常。

0 个答案:

没有答案