Delphi 6. Как установить тайм-аут idTelnet.Connect для раннего возврата при отсутствии соединения

Вызов idTelnet.Connect обычно подключается к удаленному устройству мгновенно.
Но,
если удаленное устройство не отвечает, то вызов idTelnet.Connect не возвращается.
Он ожидает ответа от удаленного устройства.

Это вешает все приложение.

Как я могу установить тайм-аут, чтобы idTelnet.Connect возвращался в течение nn мс
независимо от того, было ли установлено соединение или нет?

1 ответ

Решение

если удаленное устройство не отвечает, то вызов idTelnet.Connect не возвращается.

Да, это будет - в конце концов.

Он ожидает ответа от удаленного устройства.

Или до тех пор, пока ОС окончательно не сдастся и не разорвет соединение, сообщив об ошибке, которую Indy выдаст в качестве исключения.

Это вешает все приложение.

Это означает, что вы звоните Connect() в контексте основного потока пользовательского интерфейса, что вы не должны делать в первую очередь. Если вы должны сделать это, по крайней мере, поместите TIdAntiFreeze компонент вашей MainForm (и будьте готовы к любым последствиям повторного входа, которые могут возникнуть). В противном случае переместите ваш код сокета в отдельный рабочий поток.

Как я могу установить тайм-аут, чтобы idTelnet.Connect возвращался в течение nn мс, независимо от того, было ли установлено соединение или нет?

Вы не сказали, какую версию Indy вы используете. Delphi 6 очень старая. Если вы используете версию Indy, которая поставляется с ним, то вы используете Indy 8 или 9. Connect() В Indy 8 вообще нет функции тайм-аута. В Indy 9 Connect() имеет дополнительный ATimeout параметр. В Индии 10 ATimeout параметр был заменен на новый ConnectTimeout имущество.

Другие вопросы по тегам