brunnengi Опубликовано 2 августа, 2014 Поделиться Опубликовано 2 августа, 2014 Здравствуйте. В приложение под Android нажимаю на кнопку SEND и идет запрос в отдельном потоке. В потоке idHTTP использую timeout в 59000. var http : TIdHTTP; st: TStringList; begin http := TIdHTTP.Create(); http.ReadTimeout := 59000; http.ConnectTimeout := 59000; sResponse := http.Get('http://somesite.ru/somescript.php?date='+rDate); http.Free; Synchronize(Sync); end; Но если качество интернета плохое, или если интернет был, а потом исчез, или если просто сервер долго не отвечает, то timeout почему то не срабатывает. Может я что то не правильно делаю и надо как то по другому timeout выставлять? Подскажите плз. Цитата Ссылка на комментарий
0 eaisber Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 Я обычно делаю пинг icmp сначала с небольшим таймаутом в несколько секунд, в случае доступности уже idhttp с таймаутом побольше секунд 15 - в зависимости от вызываемого на сервере содержимого. 59с имхо это борщ Цитата Ссылка на комментарий
0 Yarpda Опубликовано 30 марта, 2015 Поделиться Опубликовано 30 марта, 2015 UP. Использую IdHHTP, ставлю любые значения connectTimeOut, и ReadTimeout, но в итоге до появления ислкючения проходит совершенно хаотично время, то 10 секунд, то 22, а то 48, а то раз и 1 секунда, все это на один и то-тот же запрос. Как такое расценивать я даже не знаю. Такое ощущение что Indy эти таймеры глубоко побоку. Но чем то же это должно объясняться. Может кто вышел из положения, подскажите пожалуйста. Проверяю так. Отключая на роутере инет, мобильный подключен по WiFi, достучаться до сайта естественно не может, но откуда разные таймауты берутся вообще не понятно... Delphi XE7.1. Цитата Ссылка на комментарий
0 xenon54 Опубликовано 30 марта, 2015 Поделиться Опубликовано 30 марта, 2015 Запрос делаете так? try HTTP.Get(...); Except On E: EIdException do begin end; end; Цитата Ссылка на комментарий
0 Yarpda Опубликовано 30 марта, 2015 Поделиться Опубликовано 30 марта, 2015 Да, конечно. Цитата Ссылка на комментарий
0 xenon54 Опубликовано 30 марта, 2015 Поделиться Опубликовано 30 марта, 2015 Именно с "EIdException" у меня работает вменяемо. Как вариант можно сделать так: type TForm1 = class(TForm) procedure Button1Click(Sender: TObject); private MyFlag : Boolean; public end; ... procedure TForm1.Button1Click(Sender: TObject); begin TThread.CreateAnonymousThread(nil, procedure() var IdHTTP1 : TIdHTTP; begin IdHTTP1 := TIdHTTP.Create(nil); form1.MyFlag := false; IdHTTP1.Get('http://lenta.ru'); form1.MyFlag := true; IdHTTP1.free; end).start; // Ну и тут запустить таймер, который проверит через нужное вам время переменную MyFlag end; Yarpda и Kitty 2 Цитата Ссылка на комментарий
0 Yarpda Опубликовано 30 марта, 2015 Поделиться Опубликовано 30 марта, 2015 Хм... Я использовал просто Exception, не уверен что есть отличия, но Спасибо, попробую. Отпишусь. Цитата Ссылка на комментарий
0 Yarpda Опубликовано 30 марта, 2015 Поделиться Опубликовано 30 марта, 2015 Именно с "EIdException" у меня работает вменяемо. Невероятно, но так действительно сработало! Правда не совсем так как предполагалось, но теперь ексепшн появляется гораздо быстрее чем установленный таймаут, но это как раз то, что нужно. Спасибо большое еще раз, сам бы не точно не догадался. )) Цитата Ссылка на комментарий
0 xenon54 Опубликовано 30 марта, 2015 Поделиться Опубликовано 30 марта, 2015 (изменено) Помнится я целый день на гугл потратил в поисках этого... А насчет того что быстрей срабатывает чем установлен таймаут, что-то тут не то, я ради интереса засекал сегодня, отрабатывает четко по таймауту. Изменено 30 марта, 2015 пользователем xenon54 zairkz и Brovin Yaroslav 2 Цитата Ссылка на комментарий
0 yura371 Опубликовано 5 апреля, 2015 Поделиться Опубликовано 5 апреля, 2015 (изменено) У меня похожая проблема: У меня есть запрос GET: IdHTTP1.ConnectTimeout:=5000; IdHTTP1.ReadTimeout:=5000; try IdHTTP1.Get('http://my1.ru/Update.txt'); connected := True; Except connected := false; end; Я специально имитирую медленное соединение( в роутере ограничиваю скорость до 1 Kbps) . В Windows всё нормально через 5 сек дальше программа выполняется, но в Android виснет(пытается все соединиться, не обращая внимания на таймаут) и запрос даже не доходит до Except. Почему не срабатывает таймаут в Android(причем как я понял именно ReadTimeout) ? Изменено 5 апреля, 2015 пользователем yura371 Цитата Ссылка на комментарий
0 xenon54 Опубликовано 6 апреля, 2015 Поделиться Опубликовано 6 апреля, 2015 Выше же написано. Используйте on E : EIdException. Brovin Yaroslav 1 Цитата Ссылка на комментарий
0 yura371 Опубликовано 6 апреля, 2015 Поделиться Опубликовано 6 апреля, 2015 (изменено) Выше же написано. Используйте on E : EIdException. Код до Except(до исключения) вообще не доходит а на GET виснет. Я пробовал "on E : EIdException" не работает, по ранее указанной причине. Изменено 6 апреля, 2015 пользователем yura371 Цитата Ссылка на комментарий
0 xenon54 Опубликовано 6 апреля, 2015 Поделиться Опубликовано 6 апреля, 2015 (изменено) Честно говоря, я не особо разбирался почему с EIdException выполнение кода заходит в блок исключений, а без нет. Но подозрительно что у всех работает, а у вас нет. Я думаю 8 пост в этой теме намекает на то что это не мои бредни которые я сам придумал, а такова работа инди. Попробуйте на пустом проекте. Вот еще одна возможная причина: If you are connecting to a hostname instead of an IP address, the hostname has to be resolved to an IP via a DNS lookup, which can take time, especially if the hostname has not been cached by the OS yet. The ConnectTimeout property does not account for that time. Изменено 6 апреля, 2015 пользователем xenon54 Цитата Ссылка на комментарий
0 yura371 Опубликовано 6 апреля, 2015 Поделиться Опубликовано 6 апреля, 2015 (изменено) Нашел проблему. Вынес IdHttp в поток, как здесь описано http://fire-monkey.ru/topic/30-fonovoe-vypolnenie-operatcii-bez-zamorazhivani/ и всё заработало. Без таймеров(таймауты оставил) и "On E: EIdException do". Спасибо Вам всем. Изменено 6 апреля, 2015 пользователем yura371 Цитата Ссылка на комментарий
0 xenon54 Опубликовано 6 апреля, 2015 Поделиться Опубликовано 6 апреля, 2015 Вынесение в отдельный поток помагает выполнять этот запрос не дожидаясь ответа. Но на работу таймаута это не влияет. Цитата Ссылка на комментарий
0 uuxyyz Опубликовано 8 апреля, 2015 Поделиться Опубликовано 8 апреля, 2015 в инди не пашут таймауты которые вы выставляете, при непосредственной работе с сокетами инди (http) использует infinite. Кстати обнаружил в XE8 какие-то новые http компоненты, может они получше. т.к инди уж очень часто преподносит сюрпризы. Цитата Ссылка на комментарий
Вопрос
brunnengi
Здравствуйте.
В приложение под Android нажимаю на кнопку SEND и идет запрос в отдельном потоке.
В потоке idHTTP использую timeout в 59000.
Но если качество интернета плохое, или если интернет был, а потом исчез, или если просто сервер долго не отвечает, то timeout почему то не срабатывает.
Может я что то не правильно делаю и надо как то по другому timeout выставлять? Подскажите плз.
Ссылка на комментарий
15 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.