Russian Qt Forum
Ноябрь 23, 2024, 05:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Можно ли выгрузить плагин без QPluginLoader?  (Прочитано 4889 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Август 25, 2014, 12:56 »

В функции загрузки своих плагинов я объявил автоматический QPluginLoader, который удаляется при выходе из этой функции. Все грузится, вызывается, работает. Но появилась потребность динамически выгружать некоторые плагины (например, из-за большой используемой памяти). На момент выгрузки QPluginLoader уже не существует, и воспользоваться его unload() я не могу. Тем не менее, плагины Qt как-то регистрирует, хранит счетчик их использования (об этом написано в мануале). Значит доступ к менеджеру плагинов какой-то должен быть. Можно ли как-то выгрузить определенный загруженный плагин без того QPluginLoader, с которым он был загружен? Я еще не экспериментировал с созданием нового QPluginLoader с именем уже загруженного, хочу, чтобы если кто знает точное решение - подсказали.
Записан

2^7-1 == 127, задумайтесь...
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Август 31, 2014, 09:44 »

ну у меня в программе я храню все QPluginLoader в куче в списке QList. по необходимости делаю unload. по другому пока не знаю как.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Август 31, 2014, 22:25 »

Я попробовал сохранить указатели. Выгружал один плагин, но он тяжелый - со своими окнами, своими нитями, даже класс QMainWindow у него свой. После выгрузки все работает, пока фокус не будет перемещен курсором в окно любого другого приложения. В этот момент мое приложение падает.
Записан

2^7-1 == 127, задумайтесь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Сентябрь 01, 2014, 16:25 »

Если у вас венда, то стоит учитывать то, что память у них выделяется под каждую длл в отдельной куче (идиоты) и освобождать эту память должен тот, кто ее выделил, то есть длл.
Ну и вообще, к моменту выгрузки длл не должно быть никаких объектов, использующих код этой длл. Попытка обратиться к такому объекту - краш.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Сентябрь 01, 2014, 16:53 »

Чшпш... ну память данных в самом плагине у меня освобождает сам плагин, он сам все окна закрывает, терминирует нити и удаляет свои объекты. И больше к нему в моем приложении никто не обращается - получается, что обращение происходит из веников, я в отладчике ловлю краш в функции QtWndProc в коде qapplication_win.cpp вызванной непосредственно из user32.dll. То есть, падает библиотека Qt при вызове из библиотеки виндов.
Записан

2^7-1 == 127, задумайтесь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Сентябрь 01, 2014, 18:12 »

Ну, скорее всего, у вас что-то недочищено плагином при выгрузке.
Я с таким игрался в 4й кутехе и всё работало (при учете двух правил, описанных выше).
Единственное, что иногда эти правила соблюсти сложно - например, QClipboard::setMimeData - QApp разрушает переданную ему миме дату при выходе, если плагин, создавший маймдату будет выгружен, то краш.
Возможно, в 5ке появился похожий косяк в нутрях Qt, надо проверять. Но ставлю на первый абзац) Ищите утечку.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Сентябрь 01, 2014, 18:58 »

Ну, скорее всего, у вас что-то недочищено плагином при выгрузке.
Я с таким игрался в 4й кутехе и всё работало (при учете двух правил, описанных выше).
Единственное, что иногда эти правила соблюсти сложно - например, QClipboard::setMimeData - QApp разрушает переданную ему миме дату при выходе, если плагин, создавший маймдату будет выгружен, то краш.
Возможно, в 5ке появился похожий косяк в нутрях Qt, надо проверять. Но ставлю на первый абзац) Ищите утечку.

Я как раз на 4-ке делаю. Похоже здесь что-то аналогичное разрушению общих данных при закрытии окна. Дело в том, что у плагина окно наследует класс QMainWindow по целой куче причин. А у основного приложения есть свое QMainWindow. Так то оно всё работает, пока не выгружается плагин. И переделать плагин на другое окно... фактически невозможно, там гвоздями прибито.

Пока решил вообще не выгружать плагины. Считать, что если хотя бы раз плагин загружен, он может потребоваться снова. Утечка в реальном использовании, по идее, не должна быть катастрофической.
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #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]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.