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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 185 186 [187] 188
2791  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 15, 2009, 11:15
2 Steven_Orko

дадада !! что то в этом роде!

но эти "сервисы" должны быть отдельными библами... я не знаю как это назвать по научному, поэтому и путаю понятия "плагин", "модуль" и т.п.

т.е сами сервисы подразумеваются пока как объект типа QThread !!! и чтобы в ядро их не сувать , мне надо как то придумать их сделать отдельно..

1. т.е в приложении например выбираем в менюшке - типа "подключить модуть"
2. открывается окошко с предложением "выберите файл модуля (т.е библиотеку)
3. выбираем к примеру Modbus.dll (so)
4. жмем "подключить(загрузить)
5. чпок - типа читаем в какой нить метке статус - типа загружен успешно + в каком нить месте приложения в списке появляется имя этого подключенного модуля и краткая характеристика..
6. при клике на название этого подключенного модуля - открывается другая форма, менюшка и т.п. в которой представлена возможность его конфигурирования и т.д. и.т.п.
т.е. применительно к Модбас - это выбрать тип канала, контроллер, точку, регистры, БД, куда все будет сохраняться, параметры опроса выбранных контроллеров, каналов, точек и т.п. и. т.д. (см. спецификацию на протокол Улыбающийся )
7. после конфигурирования всего этого дела там же в окошке к примеру жмакаем "запустить"
8. и все... типа смотрим как оно работает , можем посмотреть какие получаем данные из сконфигуренных у-в и т.п. и т.д.

У меня пока самая важная сейчас цель - понять, как мне подключать этот "модуль" к приложению!!! и это проблема!! Улыбающийся
но в принципе "легко" это можно сделать МОНОЛИТНЫМ!  НО НЕ БУДУ!

Цитировать
Судя по написанному здесь и немного далее, необходимости в использовании плагинов вообще нет, как я понимаю задачу.

ну а как обычно в приложениях такого рода это делают как подключают модули?


2792  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 15, 2009, 10:58
ну хорошо, например я послушаю ваш совет... и в приложении делаю так(примерно):

где-то в private класса MyDialog определен:
Код:
private:
  
ModuleBase  MyModuleBase;

Код:
void MyDialog::loadPlugins(const QString fileName)
{
    QPluginLoader loader(fileName);
    QObject *plugin = loader.instance();
    if (plugin) {
        PluginInterface*iMyModule = qobject_cast<PluginInterface*>(plugin);
        if (iMyModule ) {
            MyModuleBase = iMyModule ->create();
        }
    }
}

так код писать?
2793  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 20:04
Цитировать
ещё забыл уточнить: кто убивает объект? в твоём "наброске" объект вообще бессмертен...
я пока додумался только реализовать ф-ю противоположную void MyModuleCreate() и называться будет void MyModuleDestroy() Улыбающийся
Цитировать
давай тогда пойдём от обратного? - что _конкретно_ тебе требуется реализовать?
... если бы я знал... Улыбающийся
а серьезно - я хочу написать некое приложение (GPL) , наподобие SCADA... Оно бучет состоять из различных подсистем.. Каждая подсистема будет заниматься своим делом... Управлять подсистемами будет "ядро" ... Так вот, суть работы SCADA системы в кратце - сбор данных от различных источников, их обработка, архивирование и т.п. и. т.д.  Источники могут быть различные, например PLC, цифровые преобразователи (датчики), сервера, раб станции и все что угодно... Чтобы поиметь с них информацию - SCADA системе нужно знать что за источник и как с ним общаться....  т.е знать протокол обмена с неким девайсом... 
так вот, я могу впринципе все это реализовать без всяких плагинов, а чисто как некую подсистему приложения которая будет неотделима от него... но это не есть гут... поэтому я думаю эту подсистему вынести в отдельный модуль...

Например для начала хочу реализовать (как самое простое) некий модуль , который подключается к приложению и реализует протокол Modbus RTU... т.е этот модуль (после его подключения к приложению и его регистрации) должен позволять делать с ним следующее:
1. Стартовать его.
2.  Останавливать
3. Конфигурировать
4. Получать его статус , а также статусы его "подмодулей"
Модуль должен в зависимости от того как он сконфигурирован, САМ опрашивать источники данных (девайсы), вести статистику, БД и т.п. и. т.д..

А само приложение может получать нужные другим подсистемам данные от этого загруженного модуля посредством определенного API .. т.е приложению не нужны в принципе указатели на объекты в модуле... Ему нужны только АПИ!!!  (я так пока предварительно решил)

Вот я сам и в растерянности как мне поступить.. либо использовать QLibrary либо QPluginLoader

Я пока предварительно решил QPluginLoader использовать... а API реализовать через интерфейсы!!! Вот я поэтому и напираю на это Улыбающийся

Цитировать
1. У вас в программе есть некий интерфейс, реализацию которого можно подменить. Это обычный класс, от других ничем не отличается. Будете вы писать наследники этого интерфейса непосредственно у себя в программе, или выненесете их во внешнюю динамическую библиотеку - программе от этого ни холодно, ни жарко. Ей сунули указатель на обьект, она с ним поработала, удалила.
Ну в принципе сам модуль будет представлять из себя класс!!! Просто тут дилема, как его использовать.. Улыбающийся я пока и сам не понял чего хочу, поэтому пытаюсь понять идею!

Цитировать
2. Внимание, подмена понятий! То что называется интерфейсом плагина (MyModuleInterface у вас) - это не обьект, который вы будете подменять. Это синглтон для получения обьектов из динамической библиотеки.

ну ДА! Я и не говорил что это объект, объектом в моем случае является MyModule и наверное MyModulePlugin
просто мне непонятен один момент, почему везде в примерах  пишут:

class MyModulePlugin : public QObject,
                       public MyModuleInterface

а не к примеру :


class MyModulePlugin : public QThread, //!!!!!!!!!!!!!!!!!!!!!!!
                       public MyModuleInterface

т.е почему вместо QObject, нельзя подставить другой класс какой нибудь..Непонимающий  ведь сразу можно было б тогда к примеру не реализовывать MyModule, а  весь код написать в MyModuleInterface ...

Или меня опять не туда понесло? Улыбающийся
2794  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 16:58
Цитировать
позволь вопрос: а в каком потоке плагин создаст этот-самый объект? Улыбающийся

эээ..
ну я думал что таким образом:

1. Из приложения гружу плагин
2. Проверяю на соответствие моему декларированному интерфейсу
3. Потом в интерфейсе ищу ф-ю создания объекта void MyModuleCreate() ;
4. "Плагин" создает этот Модуль, который является дочерним классом класса QThread
5. Потом в интерфейсе ищу ф-ю запуска объекта void MyModuleStart() ;
6. Модуль "запускается" в работу

это вкратце Улыбающийся

Цитировать
описанное тобой чуть выше - это вовсе и не плагин
а что же тогда это что я описал?

2795  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 16:36
Это вы привели пример, в котором плагин создает некий объект, и основное приложение может получить указатель на этот объект и работать не через с интерфейсы, а напрямую с объектом? Улыбающийся

если это так, то я подразумевал иную картину... т.е когда плагин создает объект, как черный ящик.. и приложению не нужно знать чо это за ящик... оно "общается" с объектом посредством ф-й , которые в интерфейсе объявлены!
2796  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 16:15
Цитировать
это не плагин, а чёрти-что...но, раз компилится без ошиок и будет работать, пользуй.

Улыбающийся именно черти чо!! это я набросал чтобы разобраться в принципах! чисто понять!
2797  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 16:14
блина.. да как сделать то???

вместо :

Код:
class MyModulePlugin : public QObject,
                       public MyModuleInterface

писать :

Код:
class MyModulePlugin : public QThread, //!!!!!!!!!!!!!!!!!!!!!!!
                       public MyModuleInterface

и в классе MyModulePlugin реализовывать тогда всю функциональность?Непонимающий
типа вубрать вообще класс MyModule и все писать в MyModulePlugin  Непонимающий

или я них.. не пойму
2798  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 15:49
вот переделал по-новому:

это интерфейс *.h
Код:
#ifndef INTERFACES_H
#define INTERFACES_H

class MyModuleInterface
{
public:
    virtual ~MyModuleInterface() {}
    virtual void MyModuleCreate() = 0;
    virtual void MyModuleStart() = 0;
};

Q_DECLARE_INTERFACE(MyModuleInterface, "mywww.My.MyModuleInterface/1.0")

#endif

это хейдер плагина *.h
Код:
#ifndef MYPLUG_H
#define MYPLUG_H

#include <QObject>
#include <QThread>

#include "../app/interfaces.h"

//это собственно определение моего модуля, который должен чо-то выполнять
class MyModule : public QThread
{
    Q_OBJECT

protected:
    void run();
/*
тут добавлю потом в public, private различные необхлдимые мне методы
*/
};

//это как я понял плагин с интерфейсом
class MyModulePlugin : public QObject,
                       public MyModuleInterface
{
    Q_OBJECT
    Q_INTERFACES(MyModuleInterface)

public:
    void MyModuleCreate();
    void MyModuleStart();

private:
    MyModule *Module;
};

#endif

это реализация плагина *.cpp
Код:
#include <QtGui>
#include "myPlug.h"


//
void MyModule::run()
{
    printf("Module is Running \n");
    while (1) {
    /*
    тут будет собственно реализован к примеру алгоритм работы модуля
    */
    }
}

//
void MyModulePlugin::MyModuleCreate()
{
    Module = new MyModule();
}

void MyModulePlugin::MyModuleStart()
{
    Module->start();
}


Q_EXPORT_PLUGIN2(mymoduleplugin, MyModulePlugin)


вот так будет модуль работать Непонимающий?
ЗЫ: компилится без ошибок
2799  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 15:36
Цитировать
кузулис, похоже, подправил код, пока я отвечал...

дадада  Смеющийся

Цитировать
нет.

блина..   ну тогда я не понимаю нифига  Непонимающий

т.е при загрузке планина - мне придется с помошью задекларированной в интерфейсе ф-ции создать объект "MyModule",
а потом уже воспользоваться задекларированными в интерфейсе функциями - методами этого класса "MyModule" и получается тогда не нужно получать указатель на объект MyModule!!!  Непонимающий

Зы: а теперь тоже неправильно?
2800  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 15:29
кстати, в до кучи, а можно ли сделать плагин так, чтобы при его загрузке основным приложением автоматом создавался класс  MyModule и становились доступными его методы?

2801  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 15:21
Цитировать
ну так MyModule - есть потомок QThread, и в него мне надо будет добавить дополнительные методы... вот я сразу с "методами что в комментариях" типо и задекларировал его... Улыбающийся

хотя думаю это неправильно, и вообще я так понял тут изза того что имеется такая "фича" как интерфейс - то :
Цитировать
virtual void* MyModuleCreate() ;
   
декларировать наверное ненужно, т.к. можно сделать, чтобы MyModule создавался в конструкторе интерфейса, что-ли....

а уже декларировать в интерфейсе MyModuleInterface нужно такие методы как к примеру:

Start() - запуск модуля
Stop() - останов модуля
State() - статус модуля и т.п,

которые я реализую в классе MyModule   ...

Я правильно мыслю? Улыбающийся
2802  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 15:10
в общем плагин собирается если вместо:

Код:
virtual void* MyModuleCreate() ;//const = 0;

написать:

Код:
virtual void* MyModuleCreate() = 0;

Цитировать
на кой хрен в interfaces.h MyModuleInterface имеет чисто-виртуальный типизированный конструктор? бред!
деструктор! так написано в доке! что в хейдере интерфейсов должны быть чисто виртуальные ф-ции! и необходимо объявлять только деструктор!  Строит глазки



Цитировать
зачем в myPlug.h задекларирован MyModule, если вне плагина он использоваться не будет (будет использоваться суперкласс - QThread)?
ну так MyModule - есть потомок QThread, и в него мне надо будет добавить дополнительные методы... вот я сразу с "методами что в комментариях" типо и задекларировал его... Улыбающийся



  





2803  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 13:52
В общем решил сделать свой подключаемый модуль плагином....

вот код interfaces.h
Код:
#ifndef INTERFACES_H
#define INTERFACES_H

class MyModuleInterface
{
public:
    virtual ~MyModuleInterface() {}
    virtual void* MyModuleCreate() ;//const = 0;
};

Q_DECLARE_INTERFACE(MyModuleInterface, "mywww.My.MyModuleInterface/1.0")

#endif

вот код myPlug.h
Код:
#ifndef MYPLUG_H
#define MYPLUG_H

#include <QObject>
#include <QThread>

#include "../app/interfaces.h"

//это собственно определение моего модуля, который должен чо-то выполнять
class MyModule : public QThread
{
    Q_OBJECT

protected:
    void run();
/*
тут добавлю потом в public, private различные необхлдимые мне методы
*/
};

//это как я понял плагин с интерфейсом
class MyModulePlugin : public QObject,
                       public MyModuleInterface
{
    Q_OBJECT
    Q_INTERFACES(MyModuleInterface)

public:
    void* MyModuleCreate();
};

#endif


вот код myPlug.cpp
Код:
#include <QtGui>
#include "myPlug.h"


//
void MyModule::run()
{
    printf("Module is Running \n");
    /*
    тут будет собственно реализован к примеру алгоритм работы модуля
    */
}

//
void* MyModulePlugin::MyModuleCreate()
{
    return new MyModule();
}

Q_EXPORT_PLUGIN2(mymoduleplugin, MyModulePlugin)


компилирую пока под Windows XP при помощи MinGW

и компилятор выдает следующее:
Цитировать
Creating library file: release\libplug.a
release\moc_myPlug.o(.text$_ZN14MyModulePluginD1Ev[MyModulePlugin::~MyModulePlug
in()]+0x12):moc_myPlug.cpp: undefined reference to `vtable for MyModuleInterface
'
release\moc_myPlug.o(.text$_ZN14MyModulePluginD0Ev[MyModulePlugin::~MyModulePlug
in()]+0x13):moc_myPlug.cpp: undefined reference to `vtable for MyModuleInterface
'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [release\plug.dll] Error 1
mingw32-make[1]: Leaving directory `D:/projects/plg2/lib'
mingw32-make: *** [release] Error 2


2804  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 11:52
to kirill, константин

спс за наводку! Улыбающийся

Цитировать
В либе должна быть функция которая возвратит указатель на этот класс.

т.е как тут где - то на форумах написано - нужно в либе сделать функцию, при вызове которой - она возвращала класс??

типа этого:
Код:
//либа .h
class MyClass : public QThread
{
    Q_OBJECT

public:
    MyClass ();

private :
    void setOpenFileName();
};

//это ф-ция которая создает новый класс
MyClass  MyFunc = new MyClass ; //и эту функцию нужно экспортировать из библиотеки????


или как?

и:
Цитировать
автору нужно наследника кутред -> плагин будет линковаться с кутэкоре -> можно обойтись без приведения воидстар к нужному типу.

минималистичный вариант может ограничиться строкой:
Код:

QThread* createObject(QObject* parent) const { return new MyThread(parent); }

но это ещё не будет плагином - плагин должен содержать некий интерфейс, известный приложению -> читать ассистант по QPlugin, QPluginLoader, plug & paint example, etc.

1. так в чем существенная разница м/у библой плагина и просто библой с функциями?
2. и как лучше мне поступить в моем случае: создать "модуль" как плагин или просто как обычную библу?


2805  Qt / Общие вопросы / Re: Загрузка классов из динамических библиотек??? : Январь 14, 2009, 10:21
Я это читал, даже пробовал .. это все работает, но мне нужно нечто другое (я так думаю)

Суть: мне к моей проге нужно сделать "подключаемый модуль" (скорее всего плагин Улыбающийся ) который работает сам по себе и реализует некий потокол (к примеру конкретно Modbus) ...

т.е если бы я делал этот модуль не плагином - то он бы представлял из себя экземпляр класса типа QThread, который я бы запускал из основной программы, а сам этот класс работал бы сам по себе вечно там в цикле и чо-то делал по некому алгоритму! Улыбающийся

но как такое же самое проделать, но сделав мой класс - плагином я пока затрудняюсь придумать !
т.е. мне нужно из библиотеки "выдернуть" класс (который является наследником QThread к примеру)...

в примерах Assistent , Examples и т.п. "выдергиваются" функции!!!

и попутно вопрос, в чем разница по сути использования QPluginLoader и QLibrary??? если и там и там при загрузке мы в конечном итоге выдергиваем из *.dll / *.so нужные нам ф-ции???
Страниц: 1 ... 185 186 [187] 188

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