Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Редкий тип зависания TIdHTTP.Get()


Автор: MoDErahN 22.3.2012, 23:23
Здравствуйте.

Пишу небольшую тестирующую софтинку, которая делает большое количество http запросов в отдельных потоках через TIdHTTP.

Периодически метод TIdHTTP.Get() подвисает на подключении. Делаю по таймауту TIdHTTP.Socket.Close() из другого потока. В 99,9% случаев Get отвисает, и, как положено, вываливается с исключением. И все бы хорошо, но остается 0.1% случаев, когда Get после закрытия сокета не отвисает, вешая поток до скончания веков.

Да и ладно бы себе просто вешал, можно было бы запустить новый поток, но он же ж, гадина, выжирает процессор на максимум.

Оставался один вариант, брутально глушить поток через ThreadTerminate() и подчищать максимум мусора вручную (благо ошибка не очень частая, утечка не очень велика). Но, опять же, иногда после вызова ThreadTerminate() у меня повисает первичный поток, что уж совсем неприемлимо.

Возникают два вопроса:
1) Можно ли что-то сделать в случае подвисания Get чтобы он вылетал не с 99,9% вероятности, а со всеми 100%.
2) Если нельзя, то что можно делать не так, убивая поток через ThreadTerminate(), из-за чего иногда может виснуть первичный поток. Буду рад любым предположениям.

Вообще говоря, второй вопрос даже более актуален, т.к. он решает еще несколько небольших проблем.

PS: И да, я в курсе, что TerminateThread оставит в памяти стек и прочие плюшки с истекшим сроком годности, но в данном случае я готов на эти жертвы.

PSPS: Чуть не забыл, вся синхронизация осуществляется через первичный поток и TerminateThread осуществляется из него же. Т.е. вторичный поток не может быть убит, когда он блокирует какой-либо другой поток. (потому что он блокирует только первичный поток, и соответственно, не может быть в это время убит, т.к. TerminateThread осуществляется из первичного же потока)

Автор: Alexeis 23.3.2012, 08:51
Цитата(MoDErahN @  23.3.2012,  00:23 Найти цитируемый пост)
Да и ладно бы себе просто вешал, можно было бы запустить новый поток, но он же ж, гадина, выжирает процессор на максимум.

  Включить Debug Dcu, поставить программу на паузу, да глянуть где крутиться злосчастный поток.  

Автор: MoDErahN 23.3.2012, 11:07
Крутится он внутри реализации TIdHTTP инфа 100%, и если запустить туда свои шаловливые ручки, то, боюсь, энтропия его поведения только возрастет.
Но спасибо, покопаюсь в этом направлении.

Автор: MetalFan 23.3.2012, 15:08
Если версия индей не последняя, то рекомендую обновиться.

Автор: MoDErahN 24.3.2012, 12:02
Снимок недельной давности.

Автор: DYUMON 28.3.2012, 12:16
а интернет случаем не барахлит?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)