Comment puis-je terminer un QThread
Récemment ,j'ai rencontré ce problème que je memtioned dans ce Titre.
J'ai essayé en utilisant QThread::terminate(),mais je ne peux PAS arrêter
le fil ,qui est dans une impasse boucle (disons,tandis que(1)).
merci beaucoup.
source d'informationauteur user230938
Vous devez vous connecter pour publier un commentaire.
Terminaison du thread est la solution facile pour arrêter une opération asynchrone, mais il est généralement une mauvaise idée: le fil pourrait être en train de faire un appel système ou qui pourraient l'être dans le milieu de la mise à jour d'une structure de données lorsqu'il est arrêté, ce qui pourrait quitter le programme ou même le système d'exploitation dans un état instable.
Essayer de transformer votre while(1) en tout( isAlive() ) et de faire isAlive() retourne false si vous souhaitez que le fil à la sortie.
Avez-vous essayé sortie ou quitter?
Ne le thread d'appel
QThread::setTerminationEnabled(false)
? Cela causerait la fin des threads pour retarder indéfiniment.EDIT: je ne sais pas ce que plate-forme sur laquelle vous êtes, mais j'ai vérifié les Fenêtres de la mise en œuvre de QThread::terminate. En supposant que le fil était effectivement en cours d'exécution pour commencer, et la résiliation n'était pas désactivé par la fonction ci-dessus, en gros, c'est un wrapper autour de
TerminateThread()
dans l'API Windows. Cette fonction accepte un manque de respect de pas de filetage, et tend à laisser un désordre derrière avec les ressources des fuites et similaires, en balançant de l'état. Si ce n'est pas de tuer le thread, soit vous êtes dealing avec zombie noyau appels (probablement bloqué I/O) ou ont même plus de problèmes quelque part.À utiliser sans nom tuyaux
Comme lorsque où vous avez l'intention de créer des pipes utilisation
Le code ci-dessus va créer un canal qui a deux extrémités gPipeFdTest[0] pour la lecture et l'gPipeFdTest[1] pour l'écriture. Ce que vous pouvez faire dans votre exécuter la fonction définie pour lire le tuyau à l'aide de select appel système. Et à partir d'où vous voulez sortir de la course, il y mis en place pour écrire écrire à l'aide de l'appel système. Je l'ai utilisé, sélectionnez appel système pour la surveillance de la lecture à la fin de la pipe comme il convient à mon implmentation. Essayer de comprendre tout cela dans votre cas. Si vous avez besoin de plus d'aide, donnez-moi un buzz.
Edit:
Mon problème était juste comme le vôtre. J'ai eu un tout(1) de la boucle et les autres choses que j'ai essayé nécessaire mutex et autres fantaisies multithreading mumbo jumbo, qui a ajouté de la complexité et de débogage a été cauchemar. À l'aide de tuyaux absous-moi de ces complexités d'ailleurs permis de simplifier le code. Je ne dis pas que c'est la meilleure option, mais dans mon cas il s'est avéré être la meilleure et la plus propre alternative. J'ai été mis sur écoute my hung demande avant cette solution.
QThreads peut se bloquer si ils ont fini "naturellement" au cours de la résiliation.
Par exemple, sous Unix, si le thread est en attente sur "lire" appel, la résiliation de la tentative (un Unix signal) fera l' "lire" appel avorter avec un code d'erreur avant que le thread est détruit.
Qui signifie que le fil peut encore atteindre naturelles du point de sortie, tout en étant résilié. Quand il le fait, un blocage est atteint depuis quelques internes mutex est déjà verrouillé par le "mettre fin" à l'appel.
Ma solution est effectivement assurez-vous que le fil jamais retourne s'il a été résilié.
wasTerminated ici est en fait mis en place un peu plus complexe, à l'aide atomique ints: