Форум: "Основная";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
ВнизКак подождать завершение потока Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.058 c