Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.19;
Скачать: CL | DM;

Вниз

Как подождать завершение потока   Найти похожие ветки 

 
IDens   (2006-10-05 18:56) [0]

Проблема следующая:
Есть объект TCounterSI8, в котором периодически по событию таймера создается поток, считывающий значение из счетчика импульсов через COM-порт. У потока FreeOnTerminate=True. Есть также объект TCounterSI8List - наследник TObjectList, содержащий список объектов TCounterSI8. В произвольный момент времени пользователь может открыть окно настроек, поменять параметры счетчиков, добавить новые счетчики, удалить старые и закрыть окно. По закрытию окна список очищается, и заново заполняется уже с применением новых параметров. Проблема в том, что иногда возникает ситуация, когда объект TCounterSI8, запустивший поток, уже не существует (список очищен), а поток еще выполняется. И когда дело доходит до Thread.OnTerminate - выдает ошибку.
Можно ли как-нибудь подождать, когда завершатся все потоки, запущенные объектами из списка, и только после
этого очищать список?


 
Ketmar ©   (2006-10-05 19:58) [1]

TThread.WaitFor?


 
Reindeer Moss Eater ©   (2006-10-05 20:44) [2]

Какой тогда смысл в потоке, если создаем его, а потом синхронно ждем завершения?
Заменить вызов waitfor на код его execute, а сам поток убрать вообще.
Будет то же самое, и даже лучше.


 
Ketmar ©   (2006-10-05 20:44) [3]

>[2] Reindeer Moss Eater(c) 5-Oct-2006, 20:44
>Будет то же самое, и даже лучше.
а помучаться?! %-)


 
DrPass ©   (2006-10-05 22:18) [4]


> Какой тогда смысл в потоке, если создаем его, а потом синхронно
> ждем завершения?

...можно придумать сотню ситуаций, в которых именно так и нужно делать.


 
Eraser ©   (2006-10-05 22:54) [5]

> [4] DrPass ©   (05.10.06 22:18)

вижу только одну ситуацию, и то вызов WaitFor будет не сразу после создания, а где то еще, например в обработчике OnClose.. ну и то imho надо избегать таких ситуаций..


 
DrPass ©   (2006-10-05 23:27) [6]


> Eraser ©   (05.10.06 22:54) [5]

Речь идет о том, что один объект порождает поток/потоки и продолжает делать какую-либо работу. А после окончания этой работы еще и должен дождаться завершения порожденных процессов. Практическое применение - любой многопоточный сервер, будь-то СУБД, веб-сервер или еще что угодно. WaitFor тут, кстати, совсем ни к чему, тем более если дочерних потоков больше одного. Проще в каждом TThread добавить поле-флаг, которое будет самим потоком выставляться при отрабатывании Execute. И пусть родительский объект хранит ссылки на свои TThread, и по ним эти флажки отслеживает


 
Mike Petrichenko   (2006-10-05 23:57) [7]


> Проще в каждом TThread добавить поле-флаг, которое будет
> самим потоком выставляться при отрабатывании Execute. И
> пусть родительский объект хранит ссылки на свои TThread,
>  и по ним эти флажки отслеживает

А про Event не слышали?


 
DrPass ©   (2006-10-06 00:21) [8]


> Mike Petrichenko   (05.10.06 23:57) [7]

Слышали, непонятно только как это может упростить задачу. Что проще - пробежаться по TList с указателями или создавать Event для каждого потока, набивать массив дескрипторов для WaintForMultipleObjects, генерировать эти самый эвенты? Если, конечно, нужно сделать немеренно технологичную программу - тогда да, без эвентов никак. А можно еще СОМ-интерфейсик прикрутить, если руки чешутся :)


 
Германн ©   (2006-10-06 00:53) [9]


> DrPass ©   (05.10.06 22:18) [4]
>
>
> > Какой тогда смысл в потоке, если создаем его, а потом
> синхронно
> > ждем завершения?
>
> ...можно придумать сотню ситуаций, в которых именно так
> и нужно делать.
>

Наверно можно.
Но убей меня не пойму зачем это нужно для сабжа?!

> Есть объект TCounterSI8, в котором периодически по событию
> таймера создается поток, считывающий значение из счетчика
> импульсов через COM-порт.

Почему-то все леняться читать хэлп и осваивать асинхронную работу с СОМ-портом? Может потому что в Demos Дельфи есть примеры работы с Thread, но нет примеров асинхронной работы с СОМ-портом?
Лично у меня уже намечены две кандидатуры, в которые я регулярно стреляю из рогатки. :-)


 
Ketmar ©   (2006-10-06 00:56) [10]

>[9] Германн(c) 6-Oct-2006, 00:53
>Почему-то все леняться читать хэлп и осваивать асинхронную
>работу с СОМ-портом?
ты ещё помечтай, чтобы APC, порты и прочее освоили... нет, не досмотрели борланды, не дали нужных примеров...


 
Германн ©   (2006-10-06 01:14) [11]


> Ketmar ©   (06.10.06 00:56) [10]
>
> ты ещё помечтай, чтобы APC, порты и прочее освоили... нет,
>  не досмотрели борланды, не дали нужных примеров...
>

"Мне уже многое поздно,
Мне уже многим не стать
..."
Но мне уже надоело мечтать!
© Ю.Лоза + Германн :-)



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

Текущий архив: 2006.11.19;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.036 c
2-1162472187
Sergey_b
2006-11-02 15:56
2006.11.19
SELECT, UPDATE, INSERT


6-1150433786
Lex_!
2006-06-16 08:56
2006.11.19
Sessions в ISAPI приложениях


2-1162537219
WhiteBarin
2006-11-03 10:00
2006.11.19
Как сделать чтобы при загрузке была доступна только моя программа


15-1162084362
MultiLang
2006-10-29 04:12
2006.11.19
Функция перевода файлов *.pas в структуру элементов языка ?


2-1162110170
1kluben1
2006-10-29 11:22
2006.11.19
Серийный номер BIOS, CPU производителя