| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > узнать о завершении потока |
| Автор: sunnmas 3.8.2009, 14:54 | ||
| Есть поток 1, который запускает множество потоков 2 и только и делает, что следит за состоянием этих, запущенных им потоков 2. Эти потоки 2 завершают свою работу и разлагаются)). Таких потоков 2 может быть ограниченное число (определяется пользователем). Вопрос: как узнать что потоки 2 уже заканчивают свою работу, чтобы запускать новые?
|
| Автор: Romikgy 3.8.2009, 15:34 |
| OnTerminate |
| Автор: sunnmas 3.8.2009, 15:40 |
| Поток 1 не главный поток не ВЦЛЬ. ОнТерминате выполняется в главном потоке. Так не нужно |
| Автор: Romikgy 3.8.2009, 17:24 |
| через что создаются потоки тогда ? код покажи |
| Автор: sunnmas 3.8.2009, 17:47 | ||
картинка во вложении. Цветом выделен блок, которым я проверяю окончание работы потоков2 |
| Автор: Alexeis 3.8.2009, 19:51 |
| У каждого Thread есть функция waitfor, которая будет ожидать завершения потока. Ее можно вызвать из любого потока. |
| Автор: MetalFan 3.8.2009, 21:40 |
| sunnmas, ой жесть какая... может стоит сначала книжки умные почитать прежде, чем чушь городить? Добавлено через 6 минут и 56 секунд 1. деструктор у наследника TThread не перекрыт. вызов метода Destroy предка соотв. не происходит. 2. Зато перекрыт метод Execute, что нафиг не нужно) 3. в делфи не принято вызывать напрямую Destroy, для этого есть метод Free. 4. второй цикл в Execute бредовый... словишь AV или List Index out of bound легко. 5. зачем NumRegThread, если есть RegThrLst.Сount ? .... N. лучше иногда книжки почитать, чем что-то писать... |
| Автор: sunnmas 3.8.2009, 23:33 |
| Согласимся с тем что олень, но не перестанем бицца) Отступим назад. Вот пример приложения очень простого. Откуда там беруться глюки? Просвятите пожалуйста |
| Автор: atomAltera 4.8.2009, 03:35 | ||
можно и
|
| Автор: MetalFan 4.8.2009, 08:00 |
| atomAltera, а нельзя. по крайней мере так. да, синхронизация с пом.сообщений возможна, но только лучше таки книжку почитать, или очень хорошую статью на этом форуме... |
| Автор: Alexeis 4.8.2009, 09:32 |
| atomAltera, между последней строчкой потока и окончанием его жизни есть разница. По идее в момент отправки сообщения поток еще жив. Реально узнать о его завершении через хэндл можно вызвав WaitForSingleObject и дождавшись когда винда сама скажет - "да поток завершен, все его ресурсы освобождены". |
| Автор: Romikgy 4.8.2009, 10:37 | ||||||
| при использовании могу придложить такой вариант
создание объекта изменится чуть
и проверка на убит процесс или нет
если поток автоубился значит процедуру ассигн он не пройдет , жду критики ..... |
| Автор: MetalFan 4.8.2009, 14:27 |
| Romikgy, ничего конечно идея, но, имхо, потокоНЕбезопасно... |
| Автор: Alexeis 4.8.2009, 14:44 |
Почему же? Операция присвоения атомараная. Только вот негибко и не прозрачно. По моему если тебе важен момент завершения, то зачем делать FreeOnTerminate ? Классическая схема состоит в том чтобы вызвать у потока метод Terminate, который выставляет флаг Terminated в true. Правильный поток должен периодически проверять этот флаг и после установки его в true максимально быстро выйти из основного цикла. Поток вызвавший Terminate сразу же вызывает WaitFor и дожидается смерти потока(короткое время), после чего он может получить все необходимые финальные данные из убитого потока, после чего вызвать ему безопасно free; Если же потоки часто создаются и уничтожаются то это неправильная политика, потому что неэффективная. Ненужный поток легко приостанавливается эвенте, после чего перестает потреблять процессорное время и в нужный момент может сразу же приступить к новой задаче, для этого достаточно будет поставить ему новую задачу (потокобезопасно ведь поток спит на эвенте) переключить эвент в активное состояние и ждать завершения работы, после чего поток можно снова усыпить на эвенте до появления новой задачи. Т.о. вопросы уничтожения потоков появляются только по завершению работы программы один раз. Тут важно завершить связанные потоки их в правильной последовательности. |