2017-02-10 74 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. –