2012-01-11 24 views
6

Il problema è il seguente: se l'applicazione viene chiusa mentre non sta facendo nulla attivamente, viene chiusa correttamente. Se sta lavorando attivamente su qualcosa (ad esempio, in un ciclo while), tuttavia, la finestra principale si chiuderà ma il programma continuerà ad essere eseguito in background, come confermato dall'apertura del task manager.L'app Qt resta in memoria anche dopo aver chiuso MainWindow

Ho passato una buona parte di oggi a cercare su Google il problema e implementare le possibili correzioni, ma inutilmente. Sembra che la funzione quit() semplicemente non faccia nulla. Ecco alcune cose che ho provato:

  • Utilizzo di app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));. So che il segnale è attivato, perché ho provato a cambiare &app, SLOT(quit()) a qApp, SLOT(aboutQt()) e la finestra aboutQt è stata visualizzata brevemente.
  • Incluso qApp->quit(); all'inizio di una funzione che viene eseguita da un pulsante della finestra principale. L'applicazione viene eseguita su quella linea, ma non ha alcun effetto.
  • Utilizzare processEvents() per assicurarsi che la GUI sia in fase di aggiornamento.
  • Includere istruzioni come mainWindow.setAttribute(Qt::WA_QuitOnClose); in main.cpp.

Voglio solo che l'applicazione esca completamente quando la finestra principale è chiusa.

Sto usando la libreria qextserialport, se questo fa alcuna differenza.

+0

L'applicazione è multithread? – Lol4t0

+0

Non sto creando personalmente discussioni, ma non sono sicuro che la libreria che sto usando sia. Se apro il debugger e guardo sotto thread vedrò un sacco di funzioni "ntdll! LdrFindResourceEx_U". Tuttavia, vedo solo un'istanza del mio programma nei processi del task manager. PS: Perché diavolo dovresti premere Invio per inviare il messaggio invece di creare un'interruzione di riga? – SharpHawk

+0

Quindi il tuo thread principale potrebbe aspettare quei thread per completare il loro lavoro. Può essere fatto implicitamente, per esempio, i distruttori di oggetti possono aspettare che il thread finisca. Dovresti studiare il codice della tua biblioteca. PS 'qextserialport', per quanto ne so non crea alcun thread. – Lol4t0

risposta

1

Non so cosa c'è che non va, ma dal momento che lo slot riceve effettivamente il segnale, è possibile chiamare exit() da quella funzione di slot come soluzione alternativa.

+0

Penso che sia una cattiva soluzione, perché se l'applicazione elabora qualcosa in un altro thread, dopo tale interruzione, TS può ottenere alcuni dati corrotti – Lol4t0

Problemi correlati