![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]закачки никогда не "повисают". если так происходит -- у тебя неверный код.