С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
1

Блокировка при уничтожении ActiveX

10.04.2014, 12:03. Показов 1263. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.

Есть ActiveX модуль, написанный на C++ Builder 6. Исходники есть, возможность правки присутствует. Но нет полного понимания механизма работы.
Периодически наблюдается блокировка при уничтожении объекта. В отладчике вижу, что вишу в TBitmap::FreeContext.
Если исключить вызов деструктора TBitmap (например выделить память, но не удалять), то блокировки не наблюдается, но конечно идет жор памяти.

Вопрос в следующем: может ли блокировка происходить из-за неправильного (неожиданного) уничтожения ActiveX? Т.е. скажем начало уничтожения объекта пока идет прорисовка на упомянутом битмапе.

Было бы неплохо, если бы кто-то прояснил ещё про жизненный цикл объекта ActiveX.

Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2014, 12:03
Ответы с готовыми решениями:

Какова последовательность 'событий' при рождении и при уничтожении окна?
Какова последовательность 'событий' (оконных сообщений) при рождении и при уничтожении окна? При...

Ошибка при уничтожении указателя
Всем привет. Решил досканально разобраться в работе указателей и ссылок. Всё понятно в общем...

АИ- ошибка при уничтожении объекта
Помогите пожалуйста с АИ, каждый из АИ должен двигаться к друг другу, я написал код ниже, но, когда...

Уничтожится ли элемент при уничтожении класса?
Вопрос в шапке, создаю type kek = class (Tobject) public T: Tstringlist; constructor...

4
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
10.04.2014, 21:56 2
Цитата Сообщение от Tulosba Посмотреть сообщение
Было бы неплохо, если бы кто-то прояснил ещё про жизненный цикл объекта ActiveX.
Там действуют фундаментальные правила COM:
У клиента есть ссылка. Пока он работает с объектом, ссылка удерживается.
Когда объект больше не нужен, ссылка освобождается (p->Release).
Если указатель передается кому-то другому, счетчик ссылок увеливичается (p->AddRef).
Рано или поздно счетчик ссылок станет равным нулю и объект сам себя уничтожит.

Managing Object Lifetimes Through Reference Counting
http://msdn.microsoft.com/en-u... 85%29.aspx

Если исключить вызов деструктора TBitmap (например выделить память, но не удалять), то блокировки не наблюдается
Не помешали бы "раскопки" этого самого деструктора TBitmap с поиском
конкретной причины блокировки.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.04.2014, 22:05  [ТС] 3
Цитата Сообщение от Убежденный Посмотреть сообщение
Рано или поздно счетчик ссылок станет равным нулю и объект сам себя уничтожит.
Это понятно. Но вот как быть, если крутится ещё один поток и в этот момент начинается процесс уничтожения?
В обработчике (деструкторе?), который срабатывает при уничтожении ActiveX дать команду на завершение потока, дождаться его завершения и всё будет ок?
Цитата Сообщение от Убежденный Посмотреть сообщение
Не помешали бы "раскопки" этого самого деструктора TBitmap с поиском
конкретной причины блокировки.
Я так понимаю, что по какой-то причине у него залочена канва (Canvas), и FreeContext как раз ожидает разблокировки. Но это пока догадки нормальной доки не нашел что-то.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
10.04.2014, 22:12 4
Цитата Сообщение от Tulosba Посмотреть сообщение
Это понятно. Но вот как быть, если крутится ещё один поток и в этот момент начинается процесс уничтожения?
Если имеется в виду внешний, т.е. еще один клиентский поток, использующий
объект, Такого не должно быть (в идеале). Если два потока используют объект,
ссылок тоже будет две.

В обработчике (деструкторе?), который срабатывает при уничтожении ActiveX дать команду на завершение потока, дождаться его завершения и всё будет ок?
А разве есть другие варианты корректно уничтожить объект, если он
создает свои потоки ?
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.04.2014, 22:22  [ТС] 5
Цитата Сообщение от Убежденный Посмотреть сообщение
Если имеется в виду внешний, т.е. еще один клиентский поток, использующий
объект,
Внутри кода ActiveX создается новый поток, который занят некоторой своей фоновой задачей.
Цитата Сообщение от Убежденный Посмотреть сообщение
А разве есть другие варианты корректно уничтожить объект, если он
создает свои потоки ?
Ваша правда.
Видимо нужно ещё поразбирать имеющийся код.
0
10.04.2014, 22:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2014, 22:22
Помогаю со студенческими работами здесь

Передача значения при уничтожении потока
Ребята не подскажите можно ли так передавать значение из потока при его уничтожение. void...

Уничтожении сессии при перезагрузке страницы
Доброе утро! Есть сайт с калькулятором http://oknamarkt.com/kalkulyator/ После того как произведен...

Блокировка клавиши при нажатии в одной форме и блокировка в другой, третьей
Здравствуйте нужно что бы при вызове помощи в 1ом вопросе она блокировалась во 2ом...

Посодействуйте в уничтожении вирусов
Здравствуйте! Помогите избавиться от вирусов. выскакивают окошки в ВКонтакте, открываются...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru