Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Threads с ограниченным временем жизни. [D7, WinXP]


gear ©   (2006-08-18 20:42:00) 

Требуется создавать на протяжении всей "жизни" программы потоки, работающие с сетью (качают инфу с сети обрабатывают и т.п.). Такие потоки создаются каждую минуту.
По истечении работы потока он умирает и освобождает свой стэк. Но не всегда, так как канал в сеть может быть "узким" и иногда закачки просто повисают или ещё какие-нибудь затыки. И соотвественно образуется куча зомби потоков.
Программа позволяет ограничиться временем жизни потока, но вопрос, как правильно создать такой поток с ограниченным временем жизни?
То есть необходимо, чтобы каждый поток жил не более 3 минут и умирал правильно освобождая память.


Пусик   (2006-08-19 14:52:00) [1]

>Автор
Создай список потоков и хранив нем время создания.
Периодически проверяй этот список на предмет зависших потоков и убивай их (TerminateThread + TThread.Free).

Конечно, это подойдет, если в потоках у тебя не выделяются ресурсы.
В противном случае утечки памяти приведут к полному краху.


isasa   (2006-08-19 08:39:00) [2]

В потоке создай таймер на 3 минуты и, по срабатаванию, флаг Terminated:=true. Хотя, это зверство какое-то. А качать, строго, в асинхронном режиме.
Да, флаг Terminated проверять надо, периодически. :)


gear   (2006-08-19 01:49:00) [3]

2 DiamondShark

>А вот при наличии таймаутов ей просто неоткуда взяться.

Нее, просто при дайлапе качается несколько мегабайт очень долго.


Ketmar   (2006-08-18 23:21:00) [4]

> [8] Kolan ©   (18.08.06 23:16)
смотря для чего. иногда проще создавать заново (в плане кода). %-)


Kolan   (2006-08-18 23:16:00) [5]

Кстати отработавшие потоки ИМХО личьше не удалять, а усыплять тк создание/удаление потоков - накладная операция...


DiamondShark   (2006-08-18 22:39:00) [6]


> В понятие "зависают" входит не только отсутствие таймаутов

Т.е. таймауты-таки отсутствуют?
Тогда это как раз та самая задача. select перед блокирующими вызовами поможет.


> но и просто долгая закачка

А вот при наличии таймаутов ей просто неоткуда взяться.


Ketmar   (2006-08-18 22:04:00) [7]

> [4] gear   (18.08.06 21:55)
проверяй периодически флажок Terminated, и выходи из процедуры потока, если флажок установлен. это удинственный корректный способ.

зыж да, я знаю, что Земля не круглая. (ц)


Ketmar   (2006-08-18 22:04:00) [8]

offtop:
елы-палы. что ж меня так с запятыми-то глючит?


gear   (2006-08-18 21:55:00) [9]

Да вопрос не в этом. Пусть он там дубовый, хоть какой. Задача другая.
В понятие "зависают" входит не только отсутствие таймаутов, но и просто долгая закачка, которую надо прервать по истечении глобального времени жизни трэда. Там таких закачек много в цикле, но по истечении 3 минут трэд должен умереть и не важно какая иттерация цикла в этот момент идёт и что происходит.


Ketmar   (2006-08-18 21:53:00) [10]

ну да. в моём понятии такой код выпадает из определения "верный". %-)


DiamondShark   (2006-08-18 21:46:00) [11]

Формально может быть и верный, просто лениво написаный и потому дубовый.


Ketmar   (2006-08-18 20:50:00) [12]

закачки никогда не "повисают". если так происходит -- у тебя неверный код.


Наверх

Титульная страница Поиск, карта сайта Написать письмо