![]() |
|
![]() ![]() ![]() |
|
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 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++ 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. |