Wie man richtig löschen und QThread beenden
Habe ich eine Unterklasse MyClass
was erbt von QThread
.
Ich es schaffen, wie dies mit einem Elternteil die MainWindow
- Instanz (this):
mMyClass = new MyClass("some_value", 1, 5L, this);
Mein Verständnis, wie Qt beschäftigt sich mit dem löschen von Objekten ist, dass jeder QObject
, die ein Elternteil hat, der wird gelöscht, wenn das übergeordnete gelöscht wird.
Wenn mein Programm fertig stellen, ich bekomme eine Warnung QThread: Destroyed while thread is still running
Wie kann ich dieses Problem beheben up? Ich habe es versucht mit dem folgenden code in der deconstructor von MainWindow
. Leider funktioniert es nicht richtig:
if (mMyClass != 0 && mMyClass->isRunning()) {
mMyClass->deleteLater();
mMyClass->quit();
mMyClass->wait();
}
Was bedeutet
Ich glaube nicht, rufen
wait()
zurück? Hat Ihr thread starten ein Ereignis-Schleife? Das ist, nennst du exec()
in Ihrer Umsetzung run()
?Ich glaube nicht, rufen
exec
. wait()
nichts zurück.InformationsquelleAutor Niklas | 2014-07-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie nicht angegeben, welche version von Qt, die Sie verwenden, so bin ich angenommen, dass 5.3.
Ich glaube auch in deinem thread-code, den Sie haben, irgendeine form der endlos-Schleife wie folgt aus:
Erste von allen, das beste ist schließen Sie den thread
deleteLater()
- slot auf diefinished()
signal nach der thread-Erstellung:Dadurch wird der thread gelöscht werden, die von Ihren Eltern so bald wie möglich, nachdem der thread beendet seine Arbeit.
Nun, den job zu beenden, Qt 5.2 eingeführt, die Methoden
QThread::requestInterruption()
undQThread::isInterruptionRequested()
. Sie können diese Methoden verwenden, um zu sagen, deinen thread bis zum Ende mit einem code wie diesem:In deiner main-Klasse exit-code:
In deinem thread-code:
Was passieren wird, ist, dass, wenn der code, schließt das Hauptfenster aufgerufen wird, es wird "interrupt" den thread (wenn es gültig ist und ausgeführt wird). Der thread überprüft, ob er unterbrochen wurde und beendet sich, die Auslösung der
finished()
signal, das löst diedeleteLater()
- slot und endlich Ihre wichtigsten Fenster löschen, die Klasse entweder auf die Ereignis-Schleife oder an der Klasse, sauber.Überprüfen Sie die Qt 5.3 docs für mehr details.
InformationsquelleAutor Vinícius Gobbo A. de Oliveira