2015-01-06 51 views
5

Chciałbym utworzyć bibliotekę zbudowaną na bazie QTcpServer i QTcpSocket do użytku w programach, które nie mają pętli zdarzeń w ich funkcjach main (ponieważ pętla zdarzeń Qt blokuje i nie zapewnia wystarczającej rozdzielczości czasu dla wymagane operacje w czasie rzeczywistym).Czy można utworzyć lokalne pętle zdarzeń bez wywoływania funkcji QApplication :: exec()?

Miałem nadzieję ominąć to, tworząc lokalne pętle zdarzeń w klasie, ale nie wydają się działać, chyba że najpierw zadzwoniłem pod numer app->exec() w głównej funkcji. Czy istnieje sposób na utworzenie lokalnych pętli zdarzeń i zezwolenie na komunikację sygnał/gniazdo w wątku bez pętli zdarzeń na poziomie aplikacji?

Już patrzyłem na Is there a way to use Qt without QApplication::exec()?, ale odpowiedź nie pomaga, ponieważ wydaje się, że rozwiązanie dodaje lokalną pętlę zdarzeń, ale nie usuwa pętli aplikacji.

+0

spawn nowy wątek, który ma 'QApplication :: exec()' i utrzymać go przy życiu jako "główny wątek"? –

+0

Spróbuję. Jedynym minusem jest to, że nawet jeśli działa to prawdopodobnie uniemożliwi mi korzystanie z biblioteki w przyszłości z rzeczywistymi aplikacjami Qt, ponieważ z pewnością nie możesz mieć dwóch wywołań do 'QApplication :: exec' –

Odpowiedz

6

Możesz utworzyć instancję obiektu QCoreApplication w nowym wątku w bibliotece. należy sprawdzić, aby utworzyć tylko jedną instancję niej To dlatego każda aplikacja Qt powinna zawierać tylko jeden QCoreApplication:

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(); 
    } 
} 

W ten sposób można korzystać z biblioteki Qt wspólne nawet w zastosowaniach nie Qt.

+1

i może synchronizować się podczas sprawdzania i uruchamiania pętli –

+2

To zasługuje na dodatkowe +1 za sprawdzenie 'QCoreApplication :: instance()' –

+0

@NicolasHolthaus Dobra uwaga. Zrobiłem to dla ciebie. – Tay2510