2017-02-10 76 views
1

调用idTelnet.Connect通常立即连接到远程设备。
但是,
如果远程设备没有响应,则 然后对idTelnet.Connect的调用不返回。
它等待来自远程设备的响应。德尔福6.如何设置idTelnet.Connect超时无早期返回

这挂起了整个应用程序。

如何设置超时时间,以便idTelnet.Connect在nn ms
之内返回,而不管连接是否已建立?

+0

我推荐在后台线程中运行代码。 – mjn

+0

有没有ConnectTimeout属性?如果没有,我会尝试当前的Indy 10.6.2 – mjn

+0

在Indy 10中,'TIdTCPClient'具有'ConnectTimeout'属性。在Indy 9中,没有'ConnectTimeout'属性,但'Connect()'有一个可选的'ATimeout'参数。 –

回答

1

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

是的,它会 - 最终。

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

或者直到操作系统最终放弃并且连接失败,报告Indy会作为例外提出的错误。

这挂起了整个应用程序。

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

如何设置超时时间,以便idTelnet.Connect在nn ms内返回,而不管连接是否已建立?

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

+0

谢谢雷米的问题。 – AndersJ

+0

Delphi 6可以升级到Indy 10吗? – AndersJ

+0

[是的,可以](http://ww2.indyproject.org/Sockets/Docs/Indy10Installation.EN.aspx)。事实上,Indy 10支持所有的方式返回到Delphi 5. –