Comment résilier un QThread partir de l'interface graphique de l'application?
J'ai essayé d'utiliser self.terminate()
dans la classe QThread, et aussi self.thread.terminate()
dans l'interface de la classe. J'ai aussi essayé de mettre self.wait()
dans les deux cas. Cependant, il y a deux scénarios qui se produisent:
1) Le fil ne prend pas fin du tout, et le GUI se fige en attente pour le fil à la fin. Une fois le fil terminé, le GUI dégèle et tout revient à la normale.
2) Le fil, en effet, que de mettre fin, mais en même temps, il gèle l'ensemble de l'application.
J'ai aussi essayé d'utiliser self.thread.exit()
. Pas de joie.
Pour préciser davantage, je suis en train de mettre en œuvre un utilisateur-bouton abandonner dans le GUI qui permettrait de mettre fin à l'exécution du fil à n'importe quel point dans le temps.
Merci d'avance.
EDIT:
Ici est la run()
méthode:
def run(self):
if self.create:
print "calling create f"
self.emit(SIGNAL("disableCreate(bool)"))
self.create(self.password, self.email)
self.stop()
self.emit(SIGNAL("finished(bool)"), self.completed)
def stop(self):
#Tried the following, one by one (and all together too, I was desperate):
self.terminate()
self.quit()
self.exit()
self.stopped = True
self.terminated = True
#Neither works
Et voici le GUI méthode de la classe pour l'abandon de la thread:
def on_abort_clicked(self):
self.thread = threadmodule.Thread()
#Tried the following, also one by one and altogether:
self.thread.exit()
self.thread.wait()
self.thread.quit()
self.thread.terminate()
#Again, none work
Merci, mais ce n'aide pas vraiment à résoudre le problème.
Il est seulement un moyen sécuritaire de mettre fin à fil - laissez-le terminer toutes les tâches informatiques. Pour l'exécuter, vous devez vérifier fil.résilié avant l'exécution de tâches difficiles.
Eh bien, c'est certainement pas ce que je cherche.
OriginalL'auteur Bo Milanovich | 2011-10-28
Vous devez vous connecter pour publier un commentaire.
À partir de la documentation de Qt pour QThread::fin:
C'est probablement une bien meilleure idée de repenser votre enfilage de la stratégie telle que l'on peut par exemple utiliser QThread::quit() pour signaler le fil pour quitter proprement, plutôt que d'essayer d'obtenir le fil pour mettre fin à cette façon. En fait thread appelant.exit() dans le thread doit le faire en fonction de la façon dont vous avez mis en œuvre run(). Si vous souhaitez partager le code de votre méthode run du thread qui pourraient idée du pourquoi ça ne marche pas.
Hmm. Et je suppose que le
self.create()
méthode est la méthode chronophage dans le fil? Généralement ce que vous feriez dans il y a quelque chose commewhile not self.terminated() { do slow operation parts.. }
. Malheureusement, je ne connais pas Python bien, mais regarde comme il y a un filetage tutoriel ici qui pourrait l'aiderJ'ai essayé aussi. Il est arrivé de travailler un peu (le GUI de ne pas geler, mais le fil ne serait pas fin soit). Cependant, le plus étrange, c'est juste arrivé. J'ai supprimé tous les
def stop(self)
code dans le fil et ledef on_abort_clicked(self)
code dans l'interface graphique, et réécrit. J'ai simplement misself.terminate()
dans le threadstop()
fonction et n'aself.thread.stop()
dans l'interface de la classe. Il fonctionne comme un charme. Autant que je sache, c'est la première chose que j'ai essayé, et ça ne marchait pas avant. J'ai sans doute raté quelque chose.OriginalL'auteur docsteer