Подвисание потока в Delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by kosromole, 1 Mar 2013.

  1. kosromole

    kosromole New Member

    Joined:
    24 Oct 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    При тестировании программы обнаружена следующая ошибка - при открытии 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к сайтов не нагружая процессор и все потоки завершаются без проблем, если только проблемные сайты убрать со списка.

    Не могу понять, в чем проблема с этими сайтами и что между ними общего, вызывающее подвисание потока.
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Здесь без кода трудно что то ответить. И как работает http.Get('http://' + site) тоже неясно.
     
  3. kosromole

    kosromole New Member

    Joined:
    24 Oct 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Каждый поток 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% и при завершении программы этот поток так и висит и не завершается.
     
  4. notkeo

    notkeo New Member

    Joined:
    24 Dec 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    эм, попробуй выставить таймаут для соединений.
     
  5. kosromole

    kosromole New Member

    Joined:
    24 Oct 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Тайм-ауты установлены в:
    ReadTimeout:=5000;
    ConnectTimeout:=5000;

    Программа HttpAnalyzer показывает, что все проблемные сайты отдают код 200, но при проверке в своей программе

    ...
    If myhttp.ResponseCode=200 then result:=1 else result:=2;
    ...
    except
    result:=3;
    end;

    result при проверке ответа от проблемного сайта(ов) не получает ни одно из указанных значений.
     
    #5 kosromole, 1 Mar 2013
    Last edited: 1 Mar 2013
  6. Zimper

    Zimper New Member

    Joined:
    12 Jan 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Ты имееш в виду что ты синхронизируеш потоки при помощи критической секции?Если ты это имел в виду,то попробуй использовать событие(Event) для синхронизации.А подвисание потока при обработке сайта из твоего списка,скорее всего совпадение.Тут явно дело в неправильной синхронизации.
     
    #6 Zimper, 1 Mar 2013
    Last edited: 2 Mar 2013
  7. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Лол, зачем событие? Или ты думаешь, что критические секции глючные?
    ТС, проверь, последняя ли у тебя версия Indy.
     
  8. kosromole

    kosromole New Member

    Joined:
    24 Oct 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    В критической секции я получаю новый сайт из списка для каждого потока. Подвисание потока при работе с проблемными сайтами не совпадение, так как я стопиццот раз проганял программу по списку без проблемных сайтов и все ОК, как только в список кидаю один или два проблемных сайта, в конце работы программы этот один или два потока так и висят.


    Да, Indy стоят 10-ые. Для чистоты эксперимента создал новый проект и открыл Http.Get в основном потоке один из вышеуказанных проблемных сайтов, форма подвисает намертво :mad:

    Есть у кого возможность пройтись в проекте по таких сайтах и дать ответ: проблемы у меня или с сайтами?
     
  9. BlackIce

    BlackIce Elder - Старейшина

    Joined:
    10 Jan 2013
    Messages:
    100
    Likes Received:
    31
    Reputations:
    27
    Проверил, все нормально. Дэлфи -7 Инди - 9.00.10
     
  10. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    "у меня indy 10" не значит, что у тебя стоит последняя версия indy.
    В одном из старых билдов была такая трабла... билд был выпущен в 2011 году
     
  11. kosromole

    kosromole New Member

    Joined:
    24 Oct 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Спасибо за помощь, понял, что проблема у меня.

    Вы правы: трабла была с Indy10_4818, скачал и установил Indy10_4957 - проблема самоустранилась.