2015-01-06 19 views
5

Ich möchte eine Bibliothek auf QTcpServer und für die Verwendung in Programmen erstellen, die keine Ereignisschleifen in ihren main Funktionen haben (weil die Qt Ereignisschleife blockiert und nicht genügend Zeitauflösung für die Echtzeitoperationen erforderlich).Ist es möglich, lokale Ereignisschleifen ohne Aufruf von QApplication :: exec() zu erstellen?

Ich hoffte, dies zu umgehen, indem lokale Ereignisschleifen innerhalb der Klasse erstellen, aber sie scheinen nicht zu funktionieren, wenn ich app->exec() zuerst in der Hauptfunktion aufgerufen habe. Gibt es eine Möglichkeit, lokale Ereignisschleifen zu erstellen und Signal/Slot-Kommunikation innerhalb eines Threads zu ermöglichen, ohne eine Ereignisschleife auf Anwendungsebene zu haben?

Ich habe mir schon Is there a way to use Qt without QApplication::exec()? angesehen, aber die Antwort hilft nicht, weil es so aussieht, als ob die Lösung eine lokale Ereignisschleife hinzufügt, aber die Anwendungsschleife nicht entfernt.

+0

spawn einen neuen Thread, der die 'QApplication :: exec()' hat und es als "Hauptthread" am Leben erhalten? –

+0

Ich werde es versuchen. Der einzige Nachteil ist, dass selbst wenn es funktioniert, würde es wahrscheinlich verhindern, dass ich die Bibliothek in der Zukunft mit tatsächlichen Qt-Anwendungen verwenden, da Sie sicherlich nicht zwei Aufrufe von QApplication :: exec –

Antwort

6

Sie können die Instanz von QCoreApplication in einem neuen Thread in der Bibliothek erstellen. Sie sollten nur eine Instanz davon erstellen überprüfen, Das ist, weil jede Qt-Anwendung nur eine QCoreApplication enthalten:

class Q_DECL_EXPORT SharedLibrary :public QObject  
{ 
Q_OBJECT 
public: 
    SharedLibrary(); 

private slots: 

    void onStarted(); 

private: 
    static int argc = 1; 
    static char * argv[] = {"SharedLibrary", NULL}; 
    static QCoreApplication * app = NULL; 
    static QThread * thread = NULL; 
}; 


SharedLibrary::SharedLibrary() 
{ 
    if (thread == NULL) 
    { 
     thread = new QThread(); 
     connect(thread, SIGNAL(started()), this, SLOT(onStarted()), Qt::DirectConnection); 
     thread->start(); 
    } 
} 
SharedLibrary::onStarted() 
{ 
    if (QCoreApplication::instance() == NULL) 
    { 
     app = new QCoreApplication(argc, argv); 
     app->exec(); 
    } 
} 

So können Sie Ihre Qt Shared Library auch in nicht Qt-Anwendungen verwenden können.

+1

haben und vielleicht beim Überprüfen und Starten der Schleife synchronisieren können –

+2

Dies verdient eine zusätzliche +1 für die Überprüfung auf 'QCoreApplication :: instance()' –

+0

@NicolasHolthaus Gute Punkt. Ich habe das für dich getan. – Tay2510