Indy TCP Server在停用时冻结

时间:2012-06-26 18:18:55

标签: delphi delphi-xe2 deadlock indy indy10

我有一个Indy Server TIdTCPServer,它有3个不同端口的绑定。如果我将客户端连接到这3个端口,然后停用服务器,它将陷入看似死锁的状态。无论我做什么,它都不会响应我的点击,它甚至不会报告“没有响应”Windows。如果我在停用服务器之前断开客户端连接,一切都很完美。我的意思是“停用”,如Server.Active:= False;

还有其他人经历过这个吗?可能是什么造成的?我在这里没有发生任何跨越线程的事情,这可能反过来导致死锁(例如GUI更新)。我尝试了Antifreeze组件TIdAntiFreeze,但没有运气。

2 个答案:

答案 0 :(得分:4)

TIdTCPServer是一个多线程组件。服务器停用期间的死锁意味着其一个或多个客户端线程未正确终止。这通常意味着您的服务器事件处理程序正在做他们不应该做的事情,通常是捕获和丢弃Indy的内部异常,与忙于终止服务器的线程上下文同步,或者对Indy之外的其他东西进行死锁。如果没有看到你的实际代码,就无法确定实际上是哪种情况,但总是会出现用户错误导致这种死锁。

TIdAntiFreeze仅影响在主线程上下文中运行的Indy组件。 TIdTCPServer没有。

答案 1 :(得分:1)

我在Form.OnClose上添加了这段代码,效果很好!

procedure TformSFTP.FormClose(Sender: TObject; var Action: TCloseAction);
var
  iA : Integer;
  Context: TidContext;
begin
 if sftpServidorFTP.Active then
     with sftpServidorFTP.Contexts.LockList do
        try
           for iA := Count - 1 downto 0 do
           begin
              Context := Items[iA];
              if Context = nil then
                 Continue;
              Context.Connection.IOHandler.WriteBufferClear;
              Context.Connection.IOHandler.InputBuffer.Clear;
              Context.Connection.IOHandler.Close;
              if Context.Connection.Connected then
                 Context.Connection.Disconnect;
           end;
        finally
           sftpServidorFTP.Contexts.UnlockList;
        end;

if sftpServidorFTP.Active then

sftpServidorFTP.Active := False;

端;