Добрый день. Есть код загрузчика страниц(вызывается в поток):
Код:
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;
почитал на форумах что нашел, похоже таймер единственный вариант решить эту проблему