crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QLibrary. Загрузка оной библиотеки несколько раз
MishaUA
  опции профиля:
сообщение 24.1.2015, 22:37
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Доброго времени суток!
Скажите, пожалуйста, есть ли какие либо проблемы или особенности если программа будет загружать одну библиотеку несколько раз? Программа и библиотека написаны на Qt. Программа загружает библиотеку, затем через resolve запрашивает функцию, которая возвращает указатель на Qwidget, добавляет этот виджет на свою форму, затем библиотека работает сама по себе, взаимодействуя с пользователем через этот виджет, а при закрытии программы эта програма запрашивает функцию, которая возвращает QvariantMap с настройками библитоеки.
Вроде ничего сложного, но у меня такое впечатление, что если загрузить, к примеру, 2 одинаковых библиотеки (может быть загружено не ограниченое количество) есть какая-то связь между виджетами этих двух библиотек. К примеру, на виджете библиотеки есть кнопка "сохранить", которая записывает некоторые данные в структуру с настройками (а они беруться с внутрениих виджетов библиотеки) и при закрытии программы при вызове с библиотеки функции, которая возвращает QvariantMap, эта функция записывает все настройки в QvariantMap и возвращает его, так вот часто (или постоянно, но в каком порядке не понятно) в QvariantMap записываются те данные, которые должны быть записаны в QvariantMap другой библиотеки.
Когда то читал, что dll загружается в оперативу один раз, даже если её загружают несколько программ, я сильно в этом сомневаюсь, но всё же, решил переспросить.

Сама библиотека загружается динамически. После загрузки ещё перед запросом qwidget вызывается функция, которая создает QObject, он уже содержит qwidget и т.д. в том числе и функцию, которая возвращает QvariantMap.
Как известно, при загрузке динамических библиотек можно вызывать только Си функции, у меня они такие:
MyObject    *object;

extern "C" {
QObject *makeObject(QVariantMap settingsMap) {return object = new MyObject;}
QWidget *widget() {return object->widget;}
QVariantMap map() {return object->map();}
}

После загрузки библиотеки вызывается makeObject, при этом ему передаются настроки модуля (через QVariantMap), функция создает новый объект и записывает его в object. После этого запрашивается widget(). При закрытии программы она вызывает map(). Вот у меня такое ощущение, что map вызывается вообще с другой библиотеки.
Не подскажите, в чем может быть проблема?
Кстати, если действительно библиотека загружается в оперативу только один раз, даже если я её разружаю 2 и больше раза, тогда может в оперативу загружаются только оти СИшные функции? Тогда бы этим можно было бы объяснить не корректную работу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 25.1.2015, 0:29
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Поэксперементировал. Оказалось, так и есть, все функции вызываются с одной библиотеки.
Решение придумал такое:
1. Сделать базовый класс, в нем будут функции *widget(), map() и все остальные. Назовем клас MyBaseClass.
2. В библиотеке из сишных будет только одна функция - makeObject, которая будет создавать и возвращать класс, наследованый от MyBaseClass.
3. map() и прочие вызывать с этого класса.

PS: ещё так не сделал, но в другом проекте сделал именно таким способом и работает без сбоев.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 25.1.2015, 5:05
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Вобщем, так и сделал, работает нормально. Сделал, правда, немного по-ином: создание qlibrari, вызов функции, которая создает и возвращает объект, наследуемый от базового класса, удаление qlibrari, дальше работать просто через указатель на объект.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 25.1.2015, 12:42
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


В качестве альтернативы можно использовать
http://qt-project.org/doc/qt-4.8/qpluginloader.html
Цитата
A Qt plugin is stored in a shared library (a DLL) and offers these benefits over shared libraries accessed using QLibrary:
QPluginLoader checks that a plugin is linked against the same version of Qt as the application.
QPluginLoader provides direct access to a root component object (instance()), instead of forcing you to resolve a C function manually.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 25.1.2015, 12:48
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Знаю, но в моем случае лучше именно dll
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 25.1.2015, 15:13
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Ну плагин это тоже dll. :lol:

А почему лучше, если не секрет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 25.1.2015, 15:18
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


потому что dll уже почти готова))) Да и смысла узать плагины не вижу, если в обычной dll есть всё что нужно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.1.2015, 18:59
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


MishaUA, тебя не должен настораживать факт, того, что Dll загружается один раз. Дело в том что это только исполняемая часть (машинные инструкции) существуют в памяти только в одном экземпляре. экземпляров данных будет столько сколько потребуется твоей программе.

Вряд ли ты задумываешся над тем, что exe-шник (в винде, разумеется) лежащий на диске является и файлом подкачки для него (отсюда ограничение в винде - когда ты не можешь удалить/переместить exe-файл пока он запущен).

Другими словами - не отвлекайся на реализацию работы Dll-ок, если, конечно, ты не пишешь свой механизм работы с ними.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 25.1.2015, 19:02
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


А если с одной проги загружаю несколько раз одну и ту же библиотеку, то тоже создается несколько экземпляров?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.1.2015, 19:07
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(MishaUA @ 25.1.2015, 21:02) *
то тоже создается несколько экземпляров?
экземпляров данных - да, а экземпляр кода всегда один (для всех приложений)

Я бы на твоём месте использовал бы один указатель на QLibrary, если по архитектурным соображениям это невозможно или затруднительно. То можно сделать класс "Одиночку" в качестве обёртки над Dll-кой и работать через него.

"Одиночка" гарантирует, что экземпляр некого класса будет существовать в количестве - Одна штука.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 10:04