QApplication, QThread und DLL

Alles rund um die Programmierung mit Qt
Antworten
Pixtar
Beiträge: 97
Registriert: 5. Mai 2010 15:32

QApplication, QThread und DLL

Beitrag von Pixtar »

Hallo,

ich habe ein Problem bezüglich Threads in DLLs und Threads in einer QtApplication.

Ich besitze zwei verschiedene Kameras von zwei verschiedenen Herstellern deren Schnittstellen unterschiedlich sind. Aus diesem Grund habe ich zwei DLLs erstellt, welche nach außen identische Schnittstellen besitzen.

In meiner Hauptapplikation benutze ich QLibrary um die DLL einzubindne und .resolve() für das Casten der Schnittstellen.

Innerhalb der DLL benötige ich einen Thread, um dauerhaft Bilder aufzunehmen (live) und diese bereitzustellen. Meinem Wissenstand nach kann ich keine SIGNAL/SLOT-Beziehung zwischen den aufgelösten Schnittstellen und meinem Hauptprogramm herstellen, weil SIGNALE aus der DLL nicht aufgelöst werden können. Deshalb würde ich gerne einen weiteren Thread im Hauptprogramm erstellen, der die DLL dauerhaft nach neuen Daten fragt.

Das Problem an der Sache ist, dass der DLL-Thread die gesamte GUI des Hauptprogramms blockiert - woran liegt das?

Nachfolgend ein verkürztes Beispiel, wie meine Implementierung aussieht, um mir notfalls die Fehler direkt um die Ohren zu hauen oder ihr habt eine ganz andere Herrangehensweise für mich. :D

---DLL-Projekt-(Start)---

camera.h

Code: Alles auswählen

class Camera: public QObject
{
    Q_OBJECT
public:
    explicit Camera(QObject *parent = 0);
public slots:
    void isImageAvailable( );
//much more functions
private:
    bool imageFinished;
};
camera.cpp

Code: Alles auswählen

Camera::Camera( QObject *parent ) : public QObject( parent ){
    imageFinished = false;
}
bool Camera::isImageAvailable( ){
    return imageFinished;
}
//much more functions
dll.h

Code: Alles auswählen

#if defined(DLL_LIBRARY)
#  define DLLSHARED_EXPORT Q_DECL_EXPORT
#else
#  define DLLSHARED_EXPORT Q_DECL_IMPORT
#endif

QThread *thread;
Camera *camera;

extern "C" DLLSHARED_EXPORT bool initObjects( );
extern "C" DLLSHARED_EXPORT bool isImageAvailable( );
//many other functions
dll.cpp

Code: Alles auswählen

void initObjects( ){
    thread = new QThread( 0 );
    camera = new Camera( 0 );
    camera ->moveToThread( thread );
    thread->start(  );
}
bool isImageAvailable( ){
    return camera->isImageAvailable( );
}
//much more functions
---DLL-Projekt-(End)---

---Hauptprogramm-(Start)---
dllinc.h

Code: Alles auswählen

class DllInc : public QObject
{
    Q_OBJECT
public:
    explicit DllInc(QObject *parent = 0);
public slots:
    void startIt( );
private:
    typedef void (*initObjectsPrototype)(bool);
    initObjectsPrototype initObjectsFnc;
    typedef void (*isImageAvailablePrototype)(bool);
    isImageAvailablePrototype isImageAvailableFnc;
    QLibrary library;
};
dllinc.cpp

Code: Alles auswählen

DllInc::DllInc(QObject *parent) :  QObject(parent){
    library.setFileName( "TestDll" );
    library.load( );
    if( library.isLoaded( ) ){
        initObjectsFnc = (initObjectsPrototype) library.resolve("initObjects");
        isImageAvailableFnc = (isImageAvailablePrototype) library.resolve("isImageAvailable");
    }
}
void DllInc::startIt( ){
    this->initObjectsFnc( );
    while( this->isImageAvailableFnc( ) == false ){
        this->thread()->wait( 200 );
    }
    //get image now
}
mainwindow.cpp

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent)  : QMainWindow(parent){
    testBtn1 = new QPushButton("GetImage",this);
    dllInc = new DllInc( 0 );
    connect(testBtn1,SIGNAL(clicked()),dllInc ,SLOT(startIt()));
    thread = new QThread( this );
    dllInc->moveToThread( thread );
    thread->start();
}
---Hauptprogramm-(End)---

Grüße,
Pixtar
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QApplication, QThread und DLL

Beitrag von Christian81 »

Wenn Du eine ordentliches Interface - Klasse schreibst anstatt die einzelnen Funktionen per resolve() aufzulösen dann kannst Du natürlich auch Signals/Slots ganz normal benutzen. Hier ist ein Beispiel (zwar mit WinAPI aber das Wichtige ist ja die Idee dahinter mit der externen Funktion welche den Pointer auf die Implementation des Plugin-Interfaces zurück gibt: http://www.abstraction.net/ViewArticle. ... ticleID=67 )
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Pixtar
Beiträge: 97
Registriert: 5. Mai 2010 15:32

Re: QApplication, QThread und DLL

Beitrag von Pixtar »

Werde ich mich mal mit beschäftigen, dass Klassendiagramm sieht genau nach meiner Problemstellung aus :)

Wie so oft heißt es am Ende des Threads: Danke an Christian!
Antworten