Comment faire pour supprimer correctement et de mettre fin à QThread
J'ai eu une sous-classe MyClass
qui hérite de QThread
.
Je le créer comme ça avec un parent à l' MainWindow
instance (ce):
mMyClass = new MyClass("some_value", 1, 5L, this);
Ma compréhension de la façon dont Qt traite avec suppression de l'objet, c'est que chaque QObject
, qui a un parent est supprimé quand le parent est supprimé.
Si mon programme n'finition je reçois un avertissement QThread: Destroyed while thread is still running
Comment puis-je résoudre ce un? Je l'ai essayé avec le code suivant dans le déconstructeur de MainWindow
. Malheureusement, il ne fonctionne pas correctement:
if (mMyClass != 0 && mMyClass->isRunning()) {
mMyClass->deleteLater();
mMyClass->quit();
mMyClass->wait();
}
Ce n'
Je n'appelle pas
wait()
retour? Est-ce que votre démarrage du thread, une boucle d'événement? C'est, ne vous appelez exec()
de la mise en œuvre de run()
?Je n'appelle pas
exec
. wait()
ne retourne rien.
OriginalL'auteur Niklas | 2014-07-22
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas spécifié de quelle version de Qt que vous utilisez, donc je suis en supposant 5.3.
Aussi, je crois en votre code de thread que vous avez une certaine forme de boucle infinie comme suit:
Tout d'abord, le mieux est de connecter le fil
deleteLater()
fentefinished()
signal après la création du thread:Ce qui fera que le thread d'être supprimé par son parent, dès que possible après que le thread a terminé son travail.
Maintenant, pour terminer le travail, Qt 5.2 introduit les méthodes
QThread::requestInterruption()
etQThread::isInterruptionRequested()
. Vous pouvez utiliser ces méthodes pour raconter votre fil d'arrivée avec un code comme ceci:Dans votre classe principale code de sortie:
Dans votre fil code:
Ce qui va arriver, c'est que lorsque le code qui ferme votre fenêtre principale est appelée, elle "interrompre" le fil (s'il est valide et en cours d'exécution). Le thread va vérifier si elle a été interrompue et la sortie, le déclenchement de la
finished()
signal, ce qui va déclencher l'deleteLater()
fente et enfin votre fenêtre principale sera de supprimer la classe, soit à la boucle d'événements ou à la classe nettoyer.Vérifier la Qt 5.3 docs pour plus de détails.
OriginalL'auteur Vinícius Gobbo A. de Oliveira