3

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

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

4

2 回答 2

4

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

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

于 2012-06-26T19:31:25.993 回答
1

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

过程 TformSFTP.FormClose(发件人:TObject;var Action:TCloseAction);
变量
  iA:整数;
  上下文:TidContext;
开始
 如果 sftpServidorFTP.Active 那么
     用 sftpServidorFTP.Contexts.LockList 做
        尝试
           对于 iA := Count - 1 down to 0 do
           开始
              上下文:=项目[iA];
              如果 Context = nil 则
                 继续;
              Context.Connection.IOHandler.WriteBufferClear;
              Context.Connection.IOHandler.InputBuffer.Clear;
              Context.Connection.IOHandler.Close;
              如果 Context.Connection.Connected 那么
                 上下文.连接.断开;
           结尾;
        最后
           sftpServidorFTP.Contexts.UnlockList;
        结尾;

如果 sftpServidorFTP.Active 那么

sftpServidorFTP.Active := False;

结尾;

于 2013-11-20T18:51:22.583 回答