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

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

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: Загрузка классов из динамических библиотек???  (Прочитано 36828 раз)
-QT-
Гость
« Ответ #45 : Январь 15, 2009, 17:24 »

Доброго времени суток Всем !

Свои 5 копеек.

1. Ядро с
    а) классом для обновления приложения (с GUI для администрирования)
    б) классом загрузки плагинов (с GUI для администрирования)
    в) классом распределения интерфейсов в зависимости от типа загруженного плагина
    г) классом распределения прав доступа к пунктам меню (с GUI для администрирования)

2. Плагины с реализацией функционала в новом потоке. (тогда при падении одного плагина все приложение не падает и не тормозит)

Это как у меня сложилось в голове и в реализации.

На выходе получаем (для примера)
Товарно-кассовая система,
        драйвера для железа грузятся из плагинов ( можно одновременно иметь как несколько плагинов для одного типа оборудования так и для различного оборудования с выбором что использовать );
        типы загружаемых плагинов разделены по группам функционирования ( если это драйверы оборудования то загрузить, установить сохраненные значения или по дефаулту, создать пункты меню для обеспечения администрирования, протестировать оборудование и ... выдать ответ -- "ОК")
                                                                                                                   ( если это реализация бизнеслогики то выполняются необходимые действия для этого типа плагина ... )
То есть в зависимости от необходимости загружаем и используем или место кассира или место товароведа или место инспектора. и т.д.

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

Мое мнение решение с применением плагинов дает более гибкий подход к реализации и использованию ПО. продукта.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #46 : Январь 15, 2009, 19:25 »

2  -=QT=-

Цитировать
2. Плагины с реализацией функционала в новом потоке. (тогда при падении одного плагина все приложение не падает и не тормозит)

а расскажите ка на пальцах принцип как вы это реализовали! а лучше в примерчиках  Улыбающийся имею ввиду потоки! да и вообще суть! Улыбающийся

Записан

ArchLinux x86_64 / Win10 64 bit
-QT-
Гость
« Ответ #47 : Январь 16, 2009, 11:19 »

При реализации работы с плагинами сначала делаем рыбу:
Код
C++ (Qt)
#ifndef __QMYINTRFSCANER_H__
#define __QMYINTRFSCANER_H__
//
class QWidget;
class QString;
class QTranslator;
//
class QmyIntrfScaner
{
public:
 
   virtual ~QmyIntrfScaner() {}
   virtual bool hasConfigDialog() const = 0;
   virtual void configDriver(QWidget *parent = 0) = 0;
   virtual void createThread(QObject * parent = 0) = 0;
   virtual QTranslator* pluginTranslator(QString locale) = 0;
   virtual QString versionDriver() const = 0;
   virtual int typeHardWare() const = 0;
 
};
 
Q_DECLARE_INTERFACE(QmyIntrfScaner,
                   "ru.myqt.Plugin.QmyIntrfScaner/1.0");
 
#endif // __QMYINTRFSCANER_H__

Код
C++ (Qt)
#ifndef SCANERPLUGIN_H
#define SCANERPLUGIN_H
//
#include <QObject>
#include <QWidget>
#include <QString>
#include <QTranslator>
#include "qmyscanerthread.h"
 
#include "../pos/src/qmyintrfscaner.h"
//
class QmyScanerPlugin : public QObject, public QmyIntrfScaner
{
   Q_OBJECT
   Q_INTERFACES(QmyIntrfScaner)
 
public:
QmyScanerPlugin();
 
   bool hasConfigDialog() const;
   void configDriver(QWidget * parent);
   void createThread(QObject * parent);
   QTranslator* pluginTranslator(QString locale);
   QString versionDriver() const;
   int typeHardWare() const;
 
private:
   QmyScanerThread* scanerThread;
};
#endif
 

Код
C++ (Qt)
#include <QtGui>
#include <QtPlugin>
//
#include "scanerplugin.h"
//
QmyScanerPlugin::QmyScanerPlugin()
{
Q_INIT_RESOURCE(scanerplugin);
}
//
bool QmyScanerPlugin::hasConfigDialog() const
{
return true;
}
//
void QmyScanerPlugin::configDriver(QWidget *parent)
{
   if (QmyScanerPlugin::hasConfigDialog())
   {
       scanerThread->toolsDialog(parent);
   }
}
//
void QmyScanerPlugin::createThread(QObject* parent)
{
QmyScanerPlugin::scanerThread = new QmyScanerThread(parent);
connect(scanerThread, SIGNAL(sendConnect(const bool&)), parent, SLOT(showConnectScan(const bool&)));
}
//
QTranslator* QmyScanerPlugin::pluginTranslator(QString locale)
{
   if (locale.isEmpty())
       locale = QLocale::languageToString( QLocale::system().language() );
   QTranslator *translator = new QTranslator(this);
   translator->load(":/language/"+locale+".qm");
   return translator;
}
//
QString QmyScanerPlugin::versionDriver() const
{
return QString("QuickScan-6500 000.000.001");
}
//
int QmyScanerPlugin::typeHardWare() const
{
return 1;
}
//
Q_EXPORT_PLUGIN2(qmyscanerplugin, QmyScanerPlugin);
 

void QmyScanerPlugin::createThread(QObject* parent)

Создание объекта сканера.
На основе класса QmyScanerThread создает объект в отдельном потоке, который
необходимо стыковать в сигнал-слот.

Веё это выдрано из рабочего проекта.

Код
C++ (Qt)
#ifndef QMYSCANERTHREAD_H
#define QMYSCANERTHREAD_H
//
#include <QThread>
#include "qmyapiqs6500.h"
//
class QmyScanerThread : public QThread
{
Q_OBJECT
public:
QmyScanerThread(QObject * parent = 0);
virtual ~QmyScanerThread();
void run();
void toolsDialog(QWidget * parent = 0);
void toolsDialogPort(QWidget * parent = 0);
QmyApiQS6500* getQmyApiQS6500();
 
private:
QmyApiQS6500 *lpScaner;
bool lbRun;
 
signals:
   void scanerValue(const QString &);
void sendConnect(const bool&);
};
#endif
 

Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #48 : Январь 16, 2009, 11:53 »

2 -=QT=-

а реалирация ф-ци старта потока у вас вынесена в конструктор:    QmyScanerThread(QObject * parent = 0); Непонимающий

т.е при создании потока - он автоматом у вас стартует?
Записан

ArchLinux x86_64 / Win10 64 bit
-QT-
Гость
« Ответ #49 : Январь 16, 2009, 12:23 »

угу.
Можно сделать как угодно - но сделано именно так.
Это-же пример для тебя   Улыбающийся, а собственная реализация приведет к
нирване и повышенному благосостоянию.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #50 : Январь 16, 2009, 12:34 »

спс Улыбающийся

я примерно так себе все и представлял...
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


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