При тестировании программы обнаружена следующая ошибка - при открытии http.Get('http://' + site) любого из нижеуказанных сайтов поток подвисает и загружает процессор на 100%: Список сайтов: autobrestkvn.narod.ru auto.tbroker.ru z-auto.ru ozpv.ru remont-diskov.ru 451.ru carleasing.ru takoma.vl.ru interauto.nnov.ru podokonnik.ru altapress.ru sistemabank.ru avtopogruzchik.ru 1c.proclub.ru trassa.narod.ru В конце работы программы завершаются все потоки, кроме потока(ов), который работал с одним из вышеуказанных сайтов. Данные сайты, приводящие к подвисанию потока, отлавливались визуально в ручном режиме. При этом программа отлично работает и со 100 потоками, пробегает по списку 100к сайтов не нагружая процессор и все потоки завершаются без проблем, если только проблемные сайты убрать со списка. Не могу понять, в чем проблема с этими сайтами и что между ними общего, вызывающее подвисание потока.
Каждый поток class(TThread) в Execute создает myhttp:=TIdHTTP.Create(nil); Каждый поток работает с отдельным сайтом, полученным в критической секции, из TStringList. Далее: site:='site.ru'; // без http:// myhttp.Get('http://' + site); Все заключено в try - except - end; В дополнительном try - finally выполняется myhttp.Free; Ньюанс в том, что чекал и 50к, и 100к сайтов, все работает хорошо, не нагружает проц и потоки по FreeOnTerminate останавливаются без проблем. Как только кидаю в список любой проблемный сайт, поток, который подхватил его, моментально грузит проц на 100% и при завершении программы этот поток так и висит и не завершается.
Тайм-ауты установлены в: ReadTimeout:=5000; ConnectTimeout:=5000; Программа HttpAnalyzer показывает, что все проблемные сайты отдают код 200, но при проверке в своей программе ... If myhttp.ResponseCode=200 then result:=1 else result:=2; ... except result:=3; end; result при проверке ответа от проблемного сайта(ов) не получает ни одно из указанных значений.
Ты имееш в виду что ты синхронизируеш потоки при помощи критической секции?Если ты это имел в виду,то попробуй использовать событие(Event) для синхронизации.А подвисание потока при обработке сайта из твоего списка,скорее всего совпадение.Тут явно дело в неправильной синхронизации.
Лол, зачем событие? Или ты думаешь, что критические секции глючные? ТС, проверь, последняя ли у тебя версия Indy.
В критической секции я получаю новый сайт из списка для каждого потока. Подвисание потока при работе с проблемными сайтами не совпадение, так как я стопиццот раз проганял программу по списку без проблемных сайтов и все ОК, как только в список кидаю один или два проблемных сайта, в конце работы программы этот один или два потока так и висят. Да, Indy стоят 10-ые. Для чистоты эксперимента создал новый проект и открыл Http.Get в основном потоке один из вышеуказанных проблемных сайтов, форма подвисает намертво Есть у кого возможность пройтись в проекте по таких сайтах и дать ответ: проблемы у меня или с сайтами?
"у меня indy 10" не значит, что у тебя стоит последняя версия indy. В одном из старых билдов была такая трабла... билд был выпущен в 2011 году
Спасибо за помощь, понял, что проблема у меня. Вы правы: трабла была с Indy10_4818, скачал и установил Indy10_4957 - проблема самоустранилась.