当我试图阻止我的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方法,但我一直收到异常。