![]() |
|
![]() ![]() ![]() |
|
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
TThread: как узнать что поток уничтожен?
Метод Terminated закрытый ![]()
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
с помощью Wait*** функции
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Оберните Tthread своим классом - и получите доступ к полю |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Мне надо что-то вроде этого:
Это сообщение отредактировал(а) Alca - 18.3.2009, 17:05 |
|||
|
||||
Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Ну и создайте свой класс:
И уже проверяйте у себя так:
|
||||
|
|||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Anikmar, скорее всего из этого ничего не выйдет. Terminate() и Terminated служат для безболезненного завершения потока. Т.е. Terminate() сама по себе ничего не делает, кроме как взводит флаг Terminated. А Terminated используется в главной функции (Execute):
ЗЫ покрайней мере, об этом писалось в книге... -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
Все это частности. Самый дельный ответ дал как всегда Lazin.
Тем более у TThread есть свой метод WaitFor() - ожидающий прекращения потока. |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Куда его втулить? ![]() Это сообщение отредактировал(а) Alca - 19.3.2009, 10:26 |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Alca, по-моему класс TThread напрямую не используют, надо делать свой класс-наследник от TThread.
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
mrbrooks |
|
||||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
в хелпе к 2009 есть пример ![]()
с этим никто не спорит.
так делать нельзя. |
||||
|
|||||
Alca |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Я так и сделал. Добавлено через 34 секунды
Добавлено через 2 минуты и 9 секунд
Чего? |
||||||||
|
|||||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
я не в курсе как там это сделано в TThread вот обычный паттерн
|
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
сначало вызов Terminate(): затем WaitFor(); блин смотрите хелп! Добавлено через 8 минут и 51 секунду как всегда несколько проще
|
|||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
А если поток уже отработал, то:
|
||||
|
|||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
||||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Использование FreeOnTerminate = true несовместимо с любыми попытками узнать у объекта статус завершенности потока. Так как при завершении потока объект само уничтожится, и звать после этого от него любые методы уже нельзя - объект разрушен. Это сообщение отредактировал(а) xvr - 19.3.2009, 13:42 |
||||
|
|||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
а если в OnTerminate или в деструкторе потока сигналить ивентом?? Это сообщение отредактировал(а) Alca - 19.3.2009, 14:06 |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Это можно, но надо не забыть потом закрыть HANDLE этого event'а |
||||
|
|||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Типа для каждого потока надо ивенты создавать?
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Я не понимаю, чем мой подход вам не понравился? Я использовал это сто раз - все нормально, указатель обнуляется. Конкретно доя потоков не применял, но формы у меня все самоуничтожаются и обнуляют указатели. Для потоков - аналогично все должно работать. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Как то через задницу это выглядит - отпустить поток на волю (FreeOnTermiate), а потом пытаться поймать его обратно ![]() |
|||
|
||||
Alca |
|
||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Добавлено @ 00:50
Хочу так?
или так
Короче, если поток есть, то его убить, а если он еще пашет сдох, то пропустить удаление. Это сообщение отредактировал(а) Alca - 20.3.2009, 13:10 |
||||||||||
|
|||||||||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Я же предложил, оберните его в свой класс - и получите доступ к protected свойству - дополнительно можете спокойно изменить конструктор так, чтобы запомнить адрес указателя, и соответственно деструктор - чтобы его обнулить. |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Короче сделал счетчик потоков - при запуске увеличиваю, а при OnTerminate уменьшаю.
В главной форме, при нажатии кнопки "Стоп", проверяю значение счетчика на нуль. Если нуль, то пропускаю удаление потоков, если больше, то удаляю. ![]() Как вам такая идейка? Может чего-то криво? Добавлено через 1 минуту и 24 секунды
Чета у меня там была какая-то лажа, надо будет еще раз проверить.... |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
||||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Согласен Добавлено через 12 минут и 5 секунд
В OnTerminate разве потоки не начинают разрушаться? |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Вот с этого и надо было начинать ![]() Предлагаю поменять подход - не ловить за хвост недобитые потоки, а говорить тем, кто не помер, что уже пора ![]() В главной форме заводится event (CreateEvent) с ручным сбросом. При создании потока ему передают HANDLE этого event'а, от этого HANDLE поток делает DuplicateHandle и в дальнейшем ждет на нем (через WaitFor*Object). Когда дождался - закрывает свою копию HANDLE'а и завершается. Главная форма, когда надо всех прибить, просто делает SetEvent & CloseHandle. Затем создает новый event для будущего использования |
|||
|
||||
Anikmar |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Alca, я посмотрел ваш код - там слегка подправить пару строчек и никаких навротов особых нет
Что я изменил: Заголовочный файл
CXThread **BackVar; Здесь хранится указатель на поток bool FlagWork; Этот флаг показывает, что основная функция потока работает. Не особо нужная вещь - просто показывает как можно ввести собственную некую индикацию состояния потока - например индикатор прогресса. __fastcall CXThread(CXThread **BackVar, bool CreateSuspended); В конструктор добавил параметр - адрес переменной указателя потока AnsiString StrOut; Украшательское поле - для разнообразия вывода. Теперь по коду. Код потока выглядит так:
Я немножко модифицировал вывод - теперь поток засыпает на случайное значение, а с верофтность 0,5% при каждом цикле завершает самостоятельно свою работу. Основная проверочная форма теперь выглядит так:
Я добавил еще одно поле МЕМО и кнопку для заполнения. По этой кнопке пробегаю по списку потоков и вывожу их состояние: Работает, завершил работу, уничтожен. Вариант "Завершил работу" будет выдан при отключенном флаге самоликвидации - поток уже отработал, но не уничтожен. Если самоликвидация включена - то по завершению функции потока он самоуничтожается и указатель на себя обнуляет. P.S. Что-то с русским языком при копировании кода в форум глюки - как справится? |
||||||
|
|||||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Прикрепи исходники, пж. |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
||||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Типа так?
Это сообщение отредактировал(а) Alca - 26.3.2009, 00:41 |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Не совсем.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |