Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2013, 03:07   #1
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию Загрузчик на idHTTP зависает при загрузке страниц

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

Код:
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;
почитал на форумах что нашел, похоже таймер единственный вариант решить эту проблему
Pcrepair вне форума Ответить с цитированием
Старый 07.01.2013, 14:03   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
2. возможно ли ввести в поток загрузчика таймер типа:
А может лучше вместо таймера IDAntifreeze?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.01.2013, 14:35   #3
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А может лучше вместо таймера IDAntifreeze?
какой еще на ... антифриз? это многопоточная закачка страниц
- диспетчер получает список УРЛ
- запускает потоки с idHttp и передает каждому свой УРЛ
- потоки передают результат в ГлобПерем, через КС конечно
и еще много всего

расскажи о таймерах в потоке, если в курсе
из чего из делать?

Последний раз редактировалось Pcrepair; 07.01.2013 в 14:37.
Pcrepair вне форума Ответить с цитированием
Старый 07.01.2013, 15:01   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В Делфийских треадах не припомню возможности таймаута, посему могу только WIN API посоветовать. Или в FIdHttp задать таймаут:
http://www.programmersforum.ru/showthread.php?t=105570
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.01.2013, 15:19   #5
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию

да это все есть
Код:
(*---------настройка параметров закачки-----------*)
     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:=100000;
     FIdHttp.ReadTimeout:=100000;
     FIdHttp.IOHandler:=FSSL;
     FIdHttp.HandleRedirects:=True;
          FIdHttp.Request.Connection :='close';
          FIdHttp.ProtocolVersion:=pv1_0;
          //FIdHttp.Request.CustomHeaders.text := 'Cookie: PHPSESSID=7777; cityid=1';
               FIdHttp.AllowCookies:=True;
                FIdHttp.RedirectMaximum:=3;
     (*------------------------------------------------*)
и даже немного помогает
но сейчас не об этом
можно ли из потока через КС получить доступ к какомуто источнику времени, типа date но в МСек?
можно ли загасить idhttp.get по IdHttp.Socket.Close;
Pcrepair вне форума Ответить с цитированием
Старый 07.01.2013, 15:39   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Заведите список выполняемых потоков и в таймере основного потока прибивайте зависшие.
EUGY вне форума Ответить с цитированием
Старый 07.01.2013, 16:48   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
можно ли из потока через КС получить доступ к какомуто источнику времени, типа date но в МСек?
Тогда наверное нужно сделать еще один главный поток, который из под себя будет создавать дочерние потоки, и в цикле с некой задержкой проверять завершился ли определенный поток из списка. если нет то прибивать принудительно.
Я вот не помню как в Делфи организовать пул, но где-то (как бы не у Тексейры) про это читал...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.01.2013, 18:25   #8
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Тогда наверное нужно сделать еще один главный поток, который из под себя будет создавать дочерние потоки
сейчас все так почти и есть
- нажимаем кнопку "ПУСК"
- вызывается основной поток управления потоками(это чтоб таймер на форме не подвисал), получает список УРЛ(ну до 1000)
- основной поток запускает цикл создания потов закачки(внутри экземпляр idhttp)
- потоки закачивают и передают результат в ГП и стетчик потоков уменьшают на 1
- основной поток считает сколько потоков в наличии чтоб больше 10 не было, один закончил работу, дозапускается еще один
но это все делается без учета ИД потоков, просто есть ГП типа ЧИСЛО

Всетаки проблема в idHTTP. прийдеттся на основной форме лепить диспетчер потоков по таймеру проверяющий время жизни потоков
была слабая надежда что можно как то в самом экземпляре потока все сделать. так чтобы отработал 300 сек и отключился, неважно отработало ли idhttp.get
Pcrepair вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При компиляции программа зависает utro35 Общие вопросы Delphi 5 20.01.2012 11:24
пк зависает при перезагрузки ОС netbioz Компьютерное железо 6 19.11.2011 21:43
зависает IdHttp Kingcss C++ Builder 0 04.11.2011 21:28
Загрузка в Excel html-страниц, ошибки при загрузке и как их побороть Meta2 Microsoft Office Excel 17 12.11.2010 01:50