QThread: Détruit tandis que le thread est toujours en cours d'exécution
Je vais avoir des problèmes avec QThreads en python. Je veux changer la couleur d'arrière-plan de l'étiquette.
Mais Mon plantage de l'application lors du démarrage.
"QThread: Détruit tandis que le thread est toujours en cours d'exécution"
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
statusTh = statusThread(self)
self.connect(statusTh, SIGNAL('setStatus'), self.st, Qt.QueuedConnection)
statusTh.start()
def st(self):
if self.status == 'ON':
self.ui.label.setStyleSheet('background-color:green')
else:
self.ui.label.setStyleSheet('background-color:red')
class statusThread(QThread):
def __init__(self, mw):
super(statusThread, self).__init__()
def run(self):
while True:
time.sleep(1)
self.emit(SIGNAL('setStatus'))
if __name__ == "__main__":
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
Un Qt-style de solution, attribuer la fenêtre principale, comme le
Merci beaucoup. Ça fonctionne maintenant
Juste pour information, c'est fondamentalement la même chose: dans ce cas, le parent de conserver la référence au fil de l'instance et, par conséquent, il ne sera pas nettoyée.
Quelqu'un peut-il expliquer , ce n'est que Qt.QueuedConnection signifie dans la question ci-dessus ?
statusTh
parent, à savoir, super(statusThread, self).__init__(mw)
.Merci beaucoup. Ça fonctionne maintenant
Juste pour information, c'est fondamentalement la même chose: dans ce cas, le parent de conserver la référence au fil de l'instance et, par conséquent, il ne sera pas nettoyée.
Quelqu'un peut-il expliquer , ce n'est que Qt.QueuedConnection signifie dans la question ci-dessus ?
OriginalL'auteur Sergey Kostin | 2013-03-29
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas stocker une référence à la discussion après avoir été créée, ce qui signifie qu'il sera le garbage collector (ie. détruit) peu de temps après le programme des feuilles
MainWindow
s__init__
. Vous avez besoin de stocker au moins tant que le thread est en cours d'exécution, par exemple, utiliserself.statusTh
:Comme je l'ai écrit dans ma réponse. Par l'affectation de l'instance de
statusThread(self)
à une variable locale (ie. sansself.
en face de lui), il sera ordures collectées lors de la variable locale est hors de portée (ce qui n'est quand__init__
deMainWindow
est fini). Si vous stockez la référence dans une variable de membre de laMainWindow
classe (ie. avecself.
en face de lui), il ne sera pas hors de portée lorsque__init__
est fait, qui, dans le fil de l'objet n'étant pas de ces ordures.Je donnerais 10 upvotes! Belle réponse - m'a sauvé beaucoup de temps et de chagrin! Je pense que vous devez déplacer le texte du commentaire à la réponse.
Excusez-moi, mais si vous
dont want
pour stocker les références - existe t'il une méthode pour créer une nouvelle référence à l'objet(sujet)? J'ai beaucoup de méthodes qui sont besoin de travailler simultanément.OriginalL'auteur rainer