调用idTelnet.Connect通常立即连接到远程设备。
但是,
如果远程设备没有响应,则 然后对idTelnet.Connect的调用不返回。
它等待来自远程设备的响应。德尔福6.如何设置idTelnet.Connect超时无早期返回
这挂起了整个应用程序。
如何设置超时时间,以便idTelnet.Connect在nn ms
之内返回,而不管连接是否已建立?
调用idTelnet.Connect通常立即连接到远程设备。
但是,
如果远程设备没有响应,则 然后对idTelnet.Connect的调用不返回。
它等待来自远程设备的响应。德尔福6.如何设置idTelnet.Connect超时无早期返回
这挂起了整个应用程序。
如何设置超时时间,以便idTelnet.Connect在nn ms
之内返回,而不管连接是否已建立?
如果远程设备没有响应,那么对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
属性。
我推荐在后台线程中运行代码。 – mjn
有没有ConnectTimeout属性?如果没有,我会尝试当前的Indy 10.6.2 – mjn
在Indy 10中,'TIdTCPClient'具有'ConnectTimeout'属性。在Indy 9中,没有'ConnectTimeout'属性,但'Connect()'有一个可选的'ATimeout'参数。 –