【问题标题】:Delphi 6. How to set idTelnet.Connect timeout for early return on no connectionDelphi 6. 如何设置 idTelnet.Connect 超时以提前返回无连接
【发布时间】:2017-02-10 08:47:20
【问题描述】:

调用 idTelnet.Connect 通常会立即连接到远程设备。
但是,
如果远程设备没有响应, 那么对 idTelnet.Connect 的调用不会返回。
它等待来自远程设备的响应。

这会挂起整个应用程序。

如何设置超时,以便 idTelnet.Connect 在 nn ms 内返回
无论是否建立连接?

【问题讨论】:

  • 我建议在后台线程中运行代码。
  • 是否有 ConnectTimeout 属性?如果没有,我会尝试当前的 Indy 10.6.2
  • 在 Indy 10 中,TIdTCPClient 具有 ConnectTimeout 属性。在 Indy 9 中,没有 ConnectTimeout 属性,但 Connect() 有一个可选的 ATimeout 参数。

标签: delphi indy delphi-6


【解决方案1】:

如果远程设备没有响应,则对 idTelnet.Connect 的调用不会返回。

是的,最终会的。

它等待来自远程设备的响应。

或者直到操作系统最终放弃连接失败,报告一个错误,然后 Indy 将作为异常引发。

这会挂起整个应用程序。

这意味着您在主 UI 线程的上下文中调用 Connect(),您一开始就不应该这样做。如果你必须这样做,至少在你的 MainForm 上放置一个TIdAntiFreeze 组件(并准备好处理可能引入的任何重入后果)。否则,请将您的套接字代码移至单独的工作线程。

如何设置超时,以便 idTelnet.Connect 在 nn 毫秒内返回,无论是否已建立连接?

您没有说您使用的是哪个版本的 Indy。 Delphi 6 已经很老了。如果您使用的是随附的 Indy 版本,那么您使用的是 Indy 8 或 9。Connect() 在 Indy 8 中根本没有超时功能。在 Indy 9 中,Connect() 有一个可选的 ATimeout 参数.在 Indy 10 中,ATimeout 参数被替换为新的 ConnectTimeout 属性。

【讨论】:

  • 感谢 Remy 总结问题。
  • Delphi 6 可以升级到 Indy 10 吗?
  • Yes, it can。事实上,Indy 10 一直支持到 Delphi 5。
  • 我刚刚开始另一个问题/主题,寻求帮助以升级到 Indy 10。我应该继续在这里吗?我决定开始一个新的会更干净。如果这是一个错误的决定,我深表歉意。
  • @AndersJ:发布新问题是正确的,因为您提出的新问题与Connect() 超时无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
相关资源
最近更新 更多