Непонятная ситуация с временем жизни COM-объектов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Непонятная ситуация с временем жизни COM-объектов

Сообщение Jack Ferre » 11.07.2014 (Пт) 19:44

Экспериментировал с потоками и ссылками - экземпляр класса стал удалятся позже, чем должен.
Закомментировал большую часть кода, пытался найти забытую мной ссылку. Результатов ноль.
Создал копию проекта, переделал для теста.
Суть - класс CMain со ссылками на CNormal и CStupid. Перед смертью CMain должен убить объекты по ссылкам и помереть сам.
Удалил все кроме debug.print в событии Class_Terminate и вижу:
Код: Выделить всё
CNormal terminated.
CMain terminated.
CStupid terminated.

вместо
Код: Выделить всё
CNormal terminated.
CStupid terminated.
CMain terminated.

Сейчас это два идентичных класса. Почему так?
StupidClass.rar
(2.41 Кб) Скачиваний: 109


[Хакер] :: Устное замечание за неадекватное название темы. Тема переименована из «Бесит. Просто бесит.» в «Непонятная ситуация с временем жизни COM-объектов».

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Непонятная ситуация с временем жизни COM-объектов

Сообщение Хакер » 11.07.2014 (Пт) 19:52

Ты полагаешься на встроенный спрятянный под капотом механизм зачистки, и предъявляешь претензии к пому, что порядок уничтожения не совпадает с желаемым.

Если тебе важен определённый порядок, добавь с Class_Terminate явное зануление ссылок:
Код: Выделить всё
    Set obj1 = Nothing
    Set obj2 = Nothing
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Непонятная ситуация с временем жизни COM-объектов

Сообщение Jack Ferre » 11.07.2014 (Пт) 20:15

свет мигнул(

неадекватное название темы

Извиняюсь

Пытаюсь разобраться в VB-шным ООП. Казалось, что понял некоторые нюансы.
Понимаю, что Class_Terminate событие, а не деструктор. Но всё же. Еще сегодня утром все работало как мне надо, а сейчас...
Попробовал переименовать классы, файлы классов, все равно событие CStupid::Class_Terminate вылетает позже, чем CMain::Class_Terminate.
Например
Код: Выделить всё
CNormal terminated.
CNormal terminated.
CMain terminated.

и
Код: Выделить всё
CMain terminated.
CStupid terminated.
CStupid terminated.


Да и ладно с Class_Terminate. В какой последовательности они удаляются на самом деле? (без set nothing)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Непонятная ситуация с временем жизни COM-объектов

Сообщение Хакер » 11.07.2014 (Пт) 20:51

Jack Ferre писал(а):В какой последовательности они удаляются на самом деле? (без set nothing)

Ну а какая разница? Частью концепции является то, что порядок уничтожения зависящих друг от друга объектов не играет (не должен играть роли).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Непонятная ситуация с временем жизни COM-объектов

Сообщение Jack Ferre » 11.07.2014 (Пт) 21:02

Подумал над важностью порядка удаления - и правда не важно. Но...

Я создаю ссылки на объекты в потоке (т.е. вторую, которая не даст убить экземпляр класса), и для наглядности вывожу данные о смерти экземпляра объекта (т.к. новый поток может начать вызывать методы мертвого объекта и все рухнет).
UPD: событие уничтожения CStupid после CMain стало выглядеть как моя ошибка.

Зависимость порядка событий нашел: порядок модулей/классов в файле проекта *.vbp. Видимо убирал и добавлял файлы и все перепуталось.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Непонятная ситуация с временем жизни COM-объектов

Сообщение Хакер » 11.07.2014 (Пт) 21:58

Jack Ferre писал(а):Я создаю ссылки на объекты в потоке (т.е. вторую, которая не даст убить экземпляр класса), и для наглядности вывожу данные о смерти экземпляра объекта (т.к. новый поток может начать вызывать методы мертвого объекта и все рухнет).

Проект какого типа? Откуда несколько потоков в Standard EXE (с учётом того, что мой кирпич ещё не опубликован)?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Непонятная ситуация с временем жизни COM-объектов

Сообщение Jack Ferre » 12.07.2014 (Сб) 13:06

Хакер писал(а):Откуда несколько потоков в Standard EXE

Стабильных потоков нет, а нестабильных - пожалуйста.
Если что-то (DLL или ActiveX control) создает для себя потоки, то приложение перестает падать на Set/GetTlsValue. Другие причины падения пытаюсь выяснить.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Непонятная ситуация с временем жизни COM-объектов

Сообщение Хакер » 12.07.2014 (Сб) 13:22

Jack Ferre писал(а):Стабильных потоков нет, а нестабильных - пожалуйста.

Прекрати заниматься фигнёй. Кроме того, ссылки на объекты вообще недопустимо передавать между потоками STA, не делая маршаллинга. Чего ты не делаешь, я уверен.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Непонятная ситуация с временем жизни COM-объектов

Сообщение The trick » 12.07.2014 (Сб) 18:51

Jack Ferre, почитай
UA6527P


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 83

    TopList