Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.057 c
15-1162194737
IMHO
2006-10-30 10:52
2006.11.19
Кто такие Лелеки?


2-1161855570
Tab
2006-10-26 13:39
2006.11.19
локальная база данных с возможностью шифрования


15-1162183145
Slider007
2006-10-30 07:39
2006.11.19
С днем рождения ! 28 октября


15-1162058237
Ketmar
2006-10-28 21:57
2006.11.19
ай, какая чудесная картинка...


6-1149692838
RainKM
2006-06-07 19:07
2006.11.19
Сканер сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский