![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день. Есть код загрузчика страниц(вызывается в поток):
Код:
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; почитал на форумах что нашел, похоже таймер единственный вариант решить эту проблему |