Russian Qt Forum
Ноябрь 23, 2024, 05:20
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Можно ли выгрузить плагин без QPluginLoader?
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Можно ли выгрузить плагин без QPluginLoader? (Прочитано 4894 раз)
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Можно ли выгрузить плагин без QPluginLoader?
«
:
Август 25, 2014, 12:56 »
В функции загрузки своих плагинов я объявил автоматический QPluginLoader, который удаляется при выходе из этой функции. Все грузится, вызывается, работает. Но появилась потребность динамически выгружать некоторые плагины (например, из-за большой используемой памяти). На момент выгрузки QPluginLoader уже не существует, и воспользоваться его unload() я не могу. Тем не менее, плагины Qt как-то регистрирует, хранит счетчик их использования (об этом написано в мануале). Значит доступ к менеджеру плагинов какой-то должен быть. Можно ли как-то выгрузить определенный загруженный плагин без того QPluginLoader, с которым он был загружен? Я еще не экспериментировал с созданием нового QPluginLoader с именем уже загруженного, хочу, чтобы если кто знает точное решение - подсказали.
Записан
2^7-1 == 127, задумайтесь...
Fregloin
Супер
Offline
Сообщений: 1025
Re: Можно ли выгрузить плагин без QPluginLoader?
«
Ответ #1 :
Август 31, 2014, 09:44 »
ну у меня в программе я храню все QPluginLoader в куче в списке QList. по необходимости делаю unload. по другому пока не знаю как.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Можно ли выгрузить плагин без QPluginLoader?
«
Ответ #2 :
Август 31, 2014, 22:25 »
Я попробовал сохранить указатели. Выгружал один плагин, но он тяжелый - со своими окнами, своими нитями, даже класс QMainWindow у него свой. После выгрузки все работает, пока фокус не будет перемещен курсором в окно любого другого приложения. В этот момент мое приложение падает.
Записан
2^7-1 == 127, задумайтесь...
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Можно ли выгрузить плагин без QPluginLoader?
«
Ответ #3 :
Сентябрь 01, 2014, 16:25 »
Если у вас венда, то стоит учитывать то, что память у них выделяется под каждую длл в отдельной куче (идиоты) и освобождать эту память должен тот, кто ее выделил, то есть длл.
Ну и вообще, к моменту выгрузки длл не должно быть никаких объектов, использующих код этой длл. Попытка обратиться к такому объекту - краш.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Можно ли выгрузить плагин без QPluginLoader?
«
Ответ #4 :
Сентябрь 01, 2014, 16:53 »
Чшпш... ну память данных в самом плагине у меня освобождает сам плагин, он сам все окна закрывает, терминирует нити и удаляет свои объекты. И больше к нему в моем приложении никто не обращается - получается, что обращение происходит из веников, я в отладчике ловлю краш в функции QtWndProc в коде qapplication_win.cpp вызванной непосредственно из user32.dll. То есть, падает библиотека Qt при вызове из библиотеки виндов.
Записан
2^7-1 == 127, задумайтесь...
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Можно ли выгрузить плагин без QPluginLoader?
«
Ответ #5 :
Сентябрь 01, 2014, 18:12 »
Ну, скорее всего, у вас что-то недочищено плагином при выгрузке.
Я с таким игрался в 4й кутехе и всё работало (при учете двух правил, описанных выше).
Единственное, что иногда эти правила соблюсти сложно - например, QClipboard::setMimeData - QApp разрушает переданную ему миме дату при выходе, если плагин, создавший маймдату будет выгружен, то краш.
Возможно, в 5ке появился похожий косяк в нутрях Qt, надо проверять. Но ставлю на первый абзац) Ищите утечку.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Можно ли выгрузить плагин без QPluginLoader?
«
Ответ #6 :
Сентябрь 01, 2014, 18:58 »
Цитата: Авварон от Сентябрь 01, 2014, 18:12
Ну, скорее всего, у вас что-то недочищено плагином при выгрузке.
Я с таким игрался в 4й кутехе и всё работало (при учете двух правил, описанных выше).
Единственное, что иногда эти правила соблюсти сложно - например, QClipboard::setMimeData - QApp разрушает переданную ему миме дату при выходе, если плагин, создавший маймдату будет выгружен, то краш.
Возможно, в 5ке появился похожий косяк в нутрях Qt, надо проверять. Но ставлю на первый абзац) Ищите утечку.
Я как раз на 4-ке делаю. Похоже здесь что-то аналогичное разрушению общих данных при закрытии окна. Дело в том, что у плагина окно наследует класс QMainWindow по целой куче причин. А у основного приложения есть свое QMainWindow. Так то оно всё работает, пока не выгружается плагин. И переделать плагин на другое окно... фактически невозможно, там гвоздями прибито.
Пока решил вообще не выгружать плагины. Считать, что если хотя бы раз плагин загружен, он может потребоваться снова. Утечка в реальном использовании, по идее, не должна быть катастрофической.
Записан
2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Можно ли выгрузить плагин без QPluginLoader?
«
Ответ #7 :
Декабрь 28, 2014, 17:21 »
up
попытался еще раз выгружать плагины - четкая корреляция, если плагин не имеет в себе класс QMainWindow, он выгружается, но если имеет - QPluginLoader::unload() возвращает false и приложение падает, причем странным образом - в отладчике немедленно внутри этого unload(), а при простом запуске - аж во время закрытия приложения
причем в отладчике место падения не ловится - оно происходит где-то в "недрах", только в консоль выдается текст
Цитировать
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
но при падении после простого запуска в консоли ничего нет
искал у себя утечки какие-нибудь - не нашел, у меня всё нормально, если плагин с QMainWindow не выгружать руками, приложение нормально завершается
Записан
2^7-1 == 127, задумайтесь...
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...