2015-01-06 11 views
5

Vorrei creare una libreria costruita su e QTcpSocket per l'utilizzo in programmi che non hanno loop di eventi nelle loro funzioni main (poiché il ciclo di eventi Qt sta bloccando e non fornisce una risoluzione temporale sufficiente per operazioni in tempo reale richieste).È possibile creare loop eventi locali senza chiamare QApplication :: exec()?

Speravo di aggirare questo creando loop di eventi locali all'interno della classe, ma non sembrano funzionare se prima non ho chiamato app->exec() nella funzione principale. C'è un modo per creare loop di eventi locali e consentire comunicazioni segnale/slot all'interno di un thread senza avere un ciclo di eventi a livello di applicazione?

Ho già visto Is there a way to use Qt without QApplication::exec()? ma la risposta non aiuta perché sembra che la soluzione aggiunga un ciclo di eventi locale ma non rimuova il ciclo dell'applicazione.

+0

genera un nuovo thread che contiene 'QApplication :: exec()' e lo mantiene attivo come "thread principale"? –

+0

Farò un tentativo. L'unico svantaggio è che, anche se funziona, probabilmente mi precluderebbe l'utilizzo della libreria in futuro con le applicazioni Qt effettive, poiché non è possibile avere due chiamate a 'QApplication :: exec' –

risposta

6

È possibile creare l'istanza di QCoreApplication in un nuovo thread nella libreria. Si dovrebbe controllare per creare una sola istanza di esso, Questo perché ogni applicazione Qt deve contenere un solo 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(); 
    } 
} 

In questo modo è possibile utilizzare il Qt libreria condivisa anche in applicazioni non Qt.

+1

e magari sincronizzarsi sul controllo e sull'avvio del ciclo –

+2

Questo merita un +1 in più per il controllo su 'QCoreApplication :: instance()' –

+0

@NicolasHolthaus Buon punto. L'ho fatto per te. – Tay2510

Problemi correlati