无法终止 PyQT QThread
Cannot terminate PyQT QThread
这个问题与我的
有关
问题发生在我在 Alpha to Gamma
项之间切换太快的地方。 GenericThread
的 run()
方法无法在没有错误的情况下完成它的循环,因为当我在 List1
的项目之间切换时,提供给它的信息会发生变化
我已经添加了 exeptions
但这不是这种情况下的最佳解决方法,如果它是 运行 我必须终止线程然后重新启动它,但是当我终止它时, GUI freezez 永远(但它不像它在项目之间切换时一直冻结,有时 self.terminate() 有时不起作用并且冻结我无法找出原因)...
class GenericThread(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
def stop(self):
self.terminate()
def __del__(self):
self.quit()
self.wait()
def run(self):
#Some very long stuff
self.emit( QtCore.SIGNAL('itemSelectionChanged()'))
return
class MainUI(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_Win()
self.ui.setupUi(self)
self.genericThread = GenericThread(self, listIndex=2)
self.connect(self.genericThread, QtCore.SIGNAL("fillListWithItems(QString, int)"), self.fillListWithItems )
self.ui.List1.list1SelectedItem.connect(self.fill_List2)
...
def fill_List2(self):
if self.genericThread.isRunning():
self.genericThread.stop()
self.ui.List2.clear()
list1SelectedItem = str(self.ui.List1.currentItem().text())
self.genericThread.start()
现在,为什么 GUI 冻结以及如何正确终止 self.genericThread
?
根据@ekhumoro 和@Pavel 的评论,我已经解决了我的问题,现在它可以按我想要的方式运行,我想 self.terminate()
如果它有效的话会好得多。
class GenericThread(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
self.stopFlag = False
def stop(self):
self.stopFlag = True
def __del__(self):
self.quit()
self.wait()
def run(self):
#Some very long stuff
if self.stopFlag:
self.stopFlag = False #Resetting the flag (in my case I have to do this!)
break #Breaks main loop to finish 'run()'
else:
self.emit( QtCore.SIGNAL('itemSelectionChanged()'))
class MainUI(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_Win()
self.ui.setupUi(self)
self.genericThread = GenericThread(self, listIndex=2)
self.connect(self.genericThread, QtCore.SIGNAL("fillListWithItems(QString, int)"), self.fillListWithItems )
self.ui.List1.list1SelectedItem.connect(self.fill_List2)
...
def fill_List2(self):
if self.genericThread.isRunning():
self.genericThread.stop()
self.ui.List2.clear()
list1SelectedItem = str(self.ui.List1.currentItem().text())
self.genericThread.start()
这个问题与我的
问题发生在我在 Alpha to Gamma
项之间切换太快的地方。 GenericThread
的 run()
方法无法在没有错误的情况下完成它的循环,因为当我在 List1
我已经添加了 exeptions
但这不是这种情况下的最佳解决方法,如果它是 运行 我必须终止线程然后重新启动它,但是当我终止它时, GUI freezez 永远(但它不像它在项目之间切换时一直冻结,有时 self.terminate() 有时不起作用并且冻结我无法找出原因)...
class GenericThread(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
def stop(self):
self.terminate()
def __del__(self):
self.quit()
self.wait()
def run(self):
#Some very long stuff
self.emit( QtCore.SIGNAL('itemSelectionChanged()'))
return
class MainUI(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_Win()
self.ui.setupUi(self)
self.genericThread = GenericThread(self, listIndex=2)
self.connect(self.genericThread, QtCore.SIGNAL("fillListWithItems(QString, int)"), self.fillListWithItems )
self.ui.List1.list1SelectedItem.connect(self.fill_List2)
...
def fill_List2(self):
if self.genericThread.isRunning():
self.genericThread.stop()
self.ui.List2.clear()
list1SelectedItem = str(self.ui.List1.currentItem().text())
self.genericThread.start()
现在,为什么 GUI 冻结以及如何正确终止 self.genericThread
?
根据@ekhumoro 和@Pavel 的评论,我已经解决了我的问题,现在它可以按我想要的方式运行,我想 self.terminate()
如果它有效的话会好得多。
class GenericThread(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
self.stopFlag = False
def stop(self):
self.stopFlag = True
def __del__(self):
self.quit()
self.wait()
def run(self):
#Some very long stuff
if self.stopFlag:
self.stopFlag = False #Resetting the flag (in my case I have to do this!)
break #Breaks main loop to finish 'run()'
else:
self.emit( QtCore.SIGNAL('itemSelectionChanged()'))
class MainUI(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_Win()
self.ui.setupUi(self)
self.genericThread = GenericThread(self, listIndex=2)
self.connect(self.genericThread, QtCore.SIGNAL("fillListWithItems(QString, int)"), self.fillListWithItems )
self.ui.List1.list1SelectedItem.connect(self.fill_List2)
...
def fill_List2(self):
if self.genericThread.isRunning():
self.genericThread.stop()
self.ui.List2.clear()
list1SelectedItem = str(self.ui.List1.currentItem().text())
self.genericThread.start()