Если удаленное устройство не отвечает, то вызов idTelnet.Connect не возвращается.
Да, это будет - в конце концов.
Ожидает ответа от удаленного устройства.
Или до тех пор, пока ОС окончательно не откажется от соединения и сообщит об ошибке, которую Indy затем поднимет в качестве исключения.
Это повесит все приложение.
Это означает, что вы вызываете Connect()
в контексте основной темы пользовательского интерфейса, которую вы не должны делать в первую очередь. Если вы должны это сделать, по крайней мере, разместите компонент TIdAntiFreeze
на вашем MainForm (и будьте готовы к устранению любых последствий повторного входа, которые могут возникнуть). В противном случае переместите свой код сокета на отдельный рабочий поток.
Как установить таймаут, чтобы idTelnet.Connect возвращался в пределах nn ms независимо от того, установлено соединение или нет?
Вы не сказали, какая версия Indy вы используете. Delphi 6 очень старый. Если вы используете версию Indy, которая поставляется с ней, то вы используете 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'. –