2014-01-04 2 views
1

У меня следующая ситуация:Обмен данных от статического Lib между динамическим LIBS

  1. Статическая библиотека с классом А; (Регистратор)
  2. Основного приложения, которое создает класса А экземпляра, как синглтон
  3. Различных задержек загружены динамические библиотеки (плагины), которая связывает с (1.) и необходимо использовать экземпляр класса А.

Как я должен разделить синглтон от основного приложения (2.) между плагинами (3.)? Есть ли какие-либо возможности в Qt/C++ для этого?

В настоящее время я использую уродливое решение на основе разделяемой памяти, и я не думаю, что это правильно.

Я думаю о рефакторинге с использованием шаблона инъекции зависимостей, но он налагает некоторые ограничения.

SAMPLE:

Статическая библиотека "log.lib":

struct Log 
{ 
    void write(QString text); 
}; 

Основное применение "app.exe":

Log *logger = new Log; // I need only one logger for all application 

int main() 
{ 
    logger->write("Main"); 
    ... 
} 

Plugin 1 "plg1.dll"

extern Log *logger; // Logger from "app.exe" 
void Foo() 
{ 
    logger->write("Foo"); 
} 

Плагин 2 "plg2.dll"

extern Log *logger; // Logger from "app.exe" 
void Bar() 
{ 
    logger->write("Bar"); 
} 
+0

Непонятно, что вы просите, пожалуйста, вставьте код. Если я правильно понял, о чем я не уверен, вы можете создать экземпляр синглтона из своей библиотеки, возможно, через интерфейс плагина, но то, что вы пишете ... мне остается неясным, так же как это связано к использованию библиотеки статически. – lpapp

+0

Да, вы понимаете правильно. Но я не хочу создавать экземпляр * библиотечного интерфейса * logger * throught, потому что существует множество сложных взаимосвязей между библиотеками (Shared/Static/Delay loaded/mixed cases). –

ответ

1

правой, так и в порядке:

  • Вы, кажется, не использовать singleton pattern для одноэлементных случаев использования.
  • Ваш оригинальный вопрос не очень похож на Qt.
  • Это не имеет ничего общего с различием статической библиотеки или нет.
  • Вы можете заставить интерфейс плагина принять мусор мусора, чтобы вы могли установить его с помощью экземпляра из приложения.

Я бы лично использовал шаблон singleton правильно, и плагин мог также запросить сам экземпляр. Пожалуйста, обратите внимание на следующую Qt макроса:

Q_GLOBAL_STATIC(Type, VariableName)

Создает глобальный и статический объект типа QGlobalStatic, от имени VARIABLENAME и ведет себя как указатель на тип. Объект, созданный Q_GLOBAL_STATIC, инициализируется при первом использовании, что означает, что он не увеличит время загрузки приложения или библиотеки. Кроме того, объект инициализируется поточно-безопасным способом на всех платформах.

Вы можете легко построить одноэлементный образец поверх него, и на самом деле это будет даже поточно-безопасным.

Здесь вы можете найти другой пример, не используя Q_GLOBAL_STATIC, но QObject Наследование и облегчает работу с QCoreApplication, которые мы внедрили в наш проект.

https://projects.kde.org/projects/playground/games/gluon/repository/revisions/master/entry/core/singleton.h

Эта версия выше является безопасным и-нить.

+0

Отлично, спасибо. Это все решает. Постскриптум Извините за плохой английский, я над этим работаю;) –

+0

@DmitrySazonov: не волнуйтесь, добро пожаловать. – lpapp

Смежные вопросы