2015-01-15 10 views
6

Ho creato una libreria di rete basata su Qt da utilizzare con applicazioni che non eseguono un ciclo di eventi Qt e che non sono necessariamente altrimenti applicazioni Qt. Ciò è stato reso possibile con la creazione di un'istanza QCoreApplication in un thread per la risposta da Is it possible to create local event loops without calling QApplication::exec()?Avviso di soppressione "QApplicazione non creata nel filetto principale()"

Questo funziona perfettamente, ma rende sconvolto Qt (presumo che è preoccupato che cercherò di manipolare una GUI di fuori del filo principale che non funzionerebbe, ma non lo sono), quindi stampa un avviso: WARNING: QApplication was not created in main() thread.

Vorrei eliminare questo avviso che altrimenti verrà stampato sulla console X11 e molto probabilmente causerà ai miei utenti un sacco di inutili carenze. Tuttavia, mi piacerebbe solo sopprimere l'errore THIS, perché io uso qDebug per alcuni scopi legittimi e voglio vedere gli avvisi futuri. C'è un modo per farlo, come una sorta di Qt #pragma?

EDIT:

Una domanda simile è stato chiesto prima qui: Qt console application "WARNING: QApplication was not created in the main() thread", ma la risposta era fondamentalmente solo una revisione del codice senza idee significativi per eliminare l'avviso.

+1

Penso che il problema si pone perché si stanno toccando le API Qt (nel thread principale, o solo in * qualche * thread) prima di creare QApplication. Non puoi farlo (materiale modulo che dovrebbe essere fatto prima di QApplication). In particolare, stai creando QObjects. – peppe

+0

hmm, che crea un interessante problema uovo di gallina, perché la classe che uso per creare il thread 'QCoreApplication' è a sua volta un' QObject' perché ha bisogno di usare i segnali per comunicare con i socket nei thread figli. –

+1

Beh, basta dividerlo? Mantieni quella classe con la logica e crea un'altra classe che crei QCoreApplication AND un oggetto della tua classe. – peppe

risposta

8

Il problema si pone perché si stanno toccando le API Qt (nel thread principale, o solo in del thread) prima di creare QApplication. Non puoi farlo. In particolare, si sta creando un QObject di qualche tipo, che sta impostando somwhere in Qt quale Qt stesso dovrebbe considerare come thread main.

Le uniche API Qt che è possibile utilizzare prima di creare QApplication sono quelle che sono esplicitamente documentate per essere sicure in tale scenario.

Quindi: non farlo. Costruisci una QCoreApplication come prima cosa, quindi sei libero di andare.

+0

Il refactoring del mio codice in questo modulo ha risolto anche molti problemi strani e intermittenti che ho avuto con le connessioni tra oggetti in thread diversi. Sicuramente non ignorerò più questo avviso. –

Problemi correlati