无法终止 PyQT QThread

Cannot terminate PyQT QThread

这个问题与我的

有关

问题发生在我在 Alpha to Gamma 项之间切换太快的地方。 GenericThreadrun() 方法无法在没有错误的情况下完成它的循环,因为当我在 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()