![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
sunnmas |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
Есть поток 1, который запускает множество потоков 2 и только и делает, что следит за состоянием этих, запущенных им потоков 2. Эти потоки 2 завершают свою работу и разлагаются)). Таких потоков 2 может быть ограниченное число (определяется пользователем).
Вопрос: как узнать что потоки 2 уже заканчивают свою работу, чтобы запускать новые?
|
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
OnTerminate
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
sunnmas |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
Поток 1 не главный поток не ВЦЛЬ. ОнТерминате выполняется в главном потоке. Так не нужно
|
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
через что создаются потоки тогда ? код покажи
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
sunnmas |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
картинка во вложении. Цветом выделен блок, которым я проверяю окончание работы потоков2 Это сообщение отредактировал(а) sunnmas - 3.8.2009, 17:48 Присоединённый файл ( Кол-во скачиваний: 9 ) ![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
У каждого Thread есть функция waitfor, которая будет ожидать завершения потока. Ее можно вызвать из любого потока.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
sunnmas, ой жесть какая... может стоит сначала книжки умные почитать прежде, чем чушь городить?
Добавлено через 6 минут и 56 секунд 1. деструктор у наследника TThread не перекрыт. вызов метода Destroy предка соотв. не происходит. 2. Зато перекрыт метод Execute, что нафиг не нужно) 3. в делфи не принято вызывать напрямую Destroy, для этого есть метод Free. 4. второй цикл в Execute бредовый... словишь AV или List Index out of bound легко. 5. зачем NumRegThread, если есть RegThrLst.Сount ? .... N. лучше иногда книжки почитать, чем что-то писать... -------------------- There are always someone smarter than you... |
|||
|
||||
sunnmas |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
Согласимся с тем что олень, но не перестанем бицца)
Отступим назад. Вот пример приложения очень простого. Откуда там беруться глюки? Просвятите пожалуйста Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
|||
|
||||
atomAltera |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 1.8.2009 Где: localHost Репутация: нет Всего: нет |
можно и
|
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
atomAltera, а нельзя. по крайней мере так. да, синхронизация с пом.сообщений возможна, но только лучше таки книжку почитать, или очень хорошую статью на этом форуме...
-------------------- There are always someone smarter than you... |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
atomAltera, между последней строчкой потока и окончанием его жизни есть разница. По идее в момент отправки сообщения поток еще жив. Реально узнать о его завершении через хэндл можно вызвав WaitForSingleObject и дождавшись когда винда сама скажет - "да поток завершен, все его ресурсы освобождены".
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Romikgy |
|
||||||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
при использовании
могу придложить такой вариант
создание объекта изменится чуть
и проверка на убит процесс или нет
если поток автоубился значит процедуру ассигн он не пройдет , ![]() жду критики ..... -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
||||||
|
|||||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Romikgy,
ничего конечно идея, но, имхо, потокоНЕбезопасно... -------------------- There are always someone smarter than you... |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Почему же? Операция присвоения атомараная. Только вот негибко и не прозрачно. По моему если тебе важен момент завершения, то зачем делать FreeOnTerminate ? Классическая схема состоит в том чтобы вызвать у потока метод Terminate, который выставляет флаг Terminated в true. Правильный поток должен периодически проверять этот флаг и после установки его в true максимально быстро выйти из основного цикла. Поток вызвавший Terminate сразу же вызывает WaitFor и дожидается смерти потока(короткое время), после чего он может получить все необходимые финальные данные из убитого потока, после чего вызвать ему безопасно free; Если же потоки часто создаются и уничтожаются то это неправильная политика, потому что неэффективная. Ненужный поток легко приостанавливается эвенте, после чего перестает потреблять процессорное время и в нужный момент может сразу же приступить к новой задаче, для этого достаточно будет поставить ему новую задачу (потокобезопасно ведь поток спит на эвенте) переключить эвент в активное состояние и ждать завершения работы, после чего поток можно снова усыпить на эвенте до появления новой задачи. Т.о. вопросы уничтожения потоков появляются только по завершению работы программы один раз. Тут важно завершить связанные потоки их в правильной последовательности. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |