【问题标题】:Indy TCP Server freezing when deactivatingIndy TCP 服务器在停用时冻结
【发布时间】:2012-06-26 18:18:54
【问题描述】:

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

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

【问题讨论】:

  • 如果您没有连接会发生什么情况是否正确停用?如果是这样,请尝试在停用服务器之前终止来自客户端的连接
  • 是的,如果没有更多的客户端连接,它会成功停用。
  • TIdTCPServer 的Active 属性设置器会自动断开所有活动的客户端连接。但它也必须等待这些线程终止,如果这些线程没有正确终止,通常是由于事件处理程序代码中的用户错误,就会发生这种死锁。我们需要看看 Jerry 的实际代码。
  • 感谢@Remy,因为我正在 Indy 的 TIdCustomTCPServer.TerminateAllThreads 中阅读您的 cmets...除非“RLebeau”是其他人? :P 证明你知道你在说什么
  • 是的,就是我。我是 Indy 开发团队的一员。

标签: delphi delphi-xe2 deadlock indy indy10


【解决方案1】:

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

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

【讨论】:

  • 明白了这个问题不看我的代码就无法定位,我还在寻找问题的原因。这至少帮助我了解了我应该寻找的地方。
  • 我找到了源头,这是我也试图追查的内存泄漏。一旦修复了这个泄漏,这个问题也得到了修复。此内存泄漏发生在其中一个客户端线程内。
【解决方案2】:

我在 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;

结束;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 2012-12-21
    • 2021-03-13
    • 1970-01-01
    • 2016-07-02
    • 2021-11-22
    相关资源
    最近更新 更多