Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法终止PyQT QThread_Python_Multithreading_Qt_Pyqt_Qthread - Fatal编程技术网

Python 无法终止PyQT QThread

Python 无法终止PyQT QThread,python,multithreading,qt,pyqt,qthread,Python,Multithreading,Qt,Pyqt,Qthread,这个问题与我的工作有关 当我在Alpha到Gamma项目之间切换过快时,就会出现问题。GenericThread的run()方法无法毫无错误地完成其循环,因为当我在List1 我添加了例外,但这不是这种情况下的最佳解决方法,如果线程正在运行,我必须终止线程,然后重新启动它,但是当我终止它时,GUI会永远冻结(但它不像在项目之间切换时总是冻结,有时是self.terminate()有时不起作用,有时会冻结我不知道为什么) 现在,为什么GUI freez和如何正确termianteself.gene

这个问题与我的工作有关

当我在
Alpha到Gamma
项目之间切换过快时,就会出现问题。
GenericThread
run()
方法无法毫无错误地完成其循环,因为当我在
List1

我添加了
例外
,但这不是这种情况下的最佳解决方法,如果线程正在运行,我必须终止线程,然后重新启动它,但是当我终止它时,GUI会永远冻结(但它不像在项目之间切换时总是冻结,有时是self.terminate()有时不起作用,有时会冻结我不知道为什么)


现在,为什么GUI freez和如何正确termiante
self.genericThread

根据您的评论,@ekhumro和@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()

如果在再次调用start之前重新实例化self.genericThread,它是否仍然崩溃?@three_Pinepples刚刚测试了它,是的,它仍然崩溃。您必须在“stop()”之后调用“wait()”,终止函数不是immediate@mguijarr
wait()
将等待
运行()
要返回一个仅在长函数完成时才会导致的值,我不想等待太长时间,因此它将变得无用。对不起,不是真的:调用“terminate()”后,线程被“kill”,但是您必须等待它真正停止,这取决于操作系统的调度;你试过我的建议了吗?
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()