Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Загрузчик на idHTTP зависает при загрузке страниц


Автор: Pcrepair 7.1.2013, 02:12
Добрый день. Есть код загрузчика страниц(вызывается в поток):

Код

function TLoader.LoadHtmlCode(const PageUrl: String):string;
var
ErrorData:string; (*ответ сервера в тестовом виде*)
ResponseCode:integer; (*ответ сервера в виде кода ошибки*)
begin
   try
     (*---------настройка параметров закачки-----------*)
     FIdHttp.Request.UserAgent:=GetRandomUserAgent; (*получаем случайное значение Юзер-Агент*)
     FIdHttp.Request.AcceptLanguage:='ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'; (*вроде нужно*)
     FIdHttp.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.3'; (*вроде нужно*)
     FIdHttp.ConnectTimeout:=10000;
     FIdHttp.ReadTimeout:=10000;
     FIdHttp.IOHandler:=FSSL;
     FIdHttp.HandleRedirects:=True;
     Result:=AnsiLowerCase(FIdHttp.Get(PageUrl));
       except
         Result:=PageUrl;
         (*тут вызов ПРОЦ для записи ответа сервера и УРЛ в лог*)
       end;
      Exit;  (*выход из функции. в РЕЗУЛЬТАТ содержится последнее значение*)
   end;
end; 


1. При высокой скорости трафика все работает нормально:
- загрузка 100 УРЛ за 20...25 сек (10 потоков одновременно)
- никаких утечек памяти
практически все как предначертано работает
2. При наличие потребителя трафика(другой РС в сети с работающим ТОРРЕНТ, источник интернета - роутер 3 мбит\сек):
- загрузка 97...100 УРЛ за 60...120 сек 
- один или два потока зависают(есть на форме индикатор числа работающих потоков)при закачке УРЛ и могут висеть часами, пока не закрыть программу
- никакой зависимости от УРЛ нет, в одном тесте одни УРЛ не закачиваются в другом другие
- еще одна особенность: в логе фиксируется ответ сервера. при наличие конкурента на трафик от 10 до 30 УРЛ не загружаются(то же различные, от теста к тесту), хотя ответ сервера = 200 (ну это не самая большая проблема, скоро будет добавлен код перезакачки УРЛ), но о чем то этот факт говорит?

Внимание! Вопросы:
1. в чем причина такого поведения TidHttp?
возможно надо что то настроить в параметрах загрузчика?
2. возможно ли ввести в поток загрузчика таймер типа:

Код

procedure TLoader.Execute;
begin
  CallTimer;
  FIdHttp.Get(PageUrl);
end;

procedure TLoader.CallTimer;
begin
  (*тут реализация таймера на 100 сек, но на чем? TTimer явно не подойдет*)
   Событие OnTimer вызывает
   FIdHttp.Socket.Close; (*если через 100 сек страница не закачается и поток не сдохнет 
   принудительно закрыть idHTTP, поток после тоже закроется*)
   может кто подскажет реализацию таймера, на чем бы его сделать?
end;


почитал на форумах что нашел, похоже таймер единственный вариант решить эту проблему

Автор: gex5293 14.2.2013, 16:44
Ttimer в потоке? smile  а про sleep не читал?

Автор: MetalFan 14.2.2013, 17:08
Как код потока написан? FIdHttp где создается/убивается?

Цитата(Pcrepair @  7.1.2013,  02:12 Найти цитируемый пост)
возможно ли ввести в поток загрузчика таймер типа

Зачем, если и так выставил Connection/ReadTimeout? Выставь их на 100с, зачем таймеры городить?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)