Вниз
Скачать: CL | DM;

Threads с ограниченным временем жизни.   Найти похожие ветки 

← →
gear   (2006-08-18 20:42) [0]

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


← →
Ketmar ©   (2006-08-18 20:50) [1]

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


← →
DiamondShark ©   (2006-08-18 21:46) [2]

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


← →
Ketmar ©   (2006-08-18 21:53) [3]

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


← →
gear   (2006-08-18 21:55) [4]

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


← →
Ketmar ©   (2006-08-18 22:04) [5]

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

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


← →
Ketmar ©   (2006-08-18 22:04) [6]

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


← →
DiamondShark ©   (2006-08-18 22:39) [7]


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

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


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

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


← →
Kolan ©   (2006-08-18 23:16) [8]

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


← →
Ketmar ©   (2006-08-18 23:21) [9]

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


← →
gear   (2006-08-19 01:49) [10]

2 DiamondShark

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

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


← →
isasa ©   (2006-08-19 08:39) [11]

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


← →
Пусик ©   (2006-08-19 14:52) [12]

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

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.026 c
1-1155809011
harisma
2006-08-17 14:03
2006.10.01
Вызов метода предка класса минуя непосредственного предка.


15-1157976956
vidiv
2006-09-11 16:15
2006.10.01
Клиент SIP протокола для компа (IP-телефония).


3-1154330959
tomkat
2006-07-31 11:29
2006.10.01
Connect to Oracle


6-1147323742
Tempora
2006-05-11 09:02
2006.10.01
Как правильно получить содержимое FTP при помощи idFTP - indy


3-1154007138
DelphiLexx
2006-07-27 17:32
2006.10.01
TFibDataSet обмирает OnSetText




   Наверх