2011-11-15 13 views
5

Ho un'applicazione multi-thread che stavo originariamente sviluppando usando Qt 4.6 e Qt Creator 2.2 (o possibilmente 2.1), e recentemente ho aggiornato a Qt 4.7 e Qt Creator 2.3 (questo è tutto in Windows). In precedenza avevo testato l'ordine di distruzione dei vari thread e oggetti nella mia applicazione ponendo le chiamate a qCritical() nei distruttori. Ha facilmente confermato che le cose venivano distrutte nell'ordine che mi aspettavo.Perché qCritical o qDebug non dovrebbero funzionare quando vengono chiamati da un distruttore?

Tuttavia, dopo l'aggiornamento alle versioni più recenti ho notato che i messaggi non sono sempre visualizzati nel pannello Output applicazione in Qt Creator. L'ordine dei messaggi è sempre corretto, ma in alcuni punti casuali l'output smette di essere mostrato. A volte non viene mostrato alcun output. Tuttavia, posso confermare che gli oggetti sono stati distrutti e che la mia applicazione viene chiusa senza errori.

Il problema si verifica ancora quando si utilizza qDebug() per visualizzare i messaggi, ma tutto viene visualizzato correttamente se si utilizza invece un semplice printf(). Quale potrebbe essere il motivo per cui l'uscita dell'applicazione si arresta prima che l'applicazione completi il ​​suo clean-up? Ci sono modifiche alle versioni più recenti di Qt o Qt Creator che alterano il comportamento di queste funzioni quando vengono chiamate all'interno di un distruttore?

+0

Puoi aggiungere il tuo codice? Succede la stessa cosa se si esegue l'applicazione da cmd.exe? –

+0

@ Styne666: proverò ad estrarre un piccolo segmento di codice che riproduce il problema. C'è troppo da postare così com'è. – gnovice

risposta

0

Poiché qDebug interagisce con QApplication e, potrebbe essere, ora parte di esso viene distrutto prima di tutte le altre parti dell'applicazione. Può essere. Tuttavia, prova a distruggere manualmente gli oggetti, quindi chiama QApplication :: exit();

Problemi correlati