QThread没有实现run方法

时间:2015-01-16 20:16:01

标签: python multithreading pyqt qthread

我在(pyqt)的QThreads有一个奇怪的问题。 我测试了QThread,实现了 run 方法并在其中运行了一个无限循环。它不会影响主线程(gui)。但是当我发出信号时 像下面的伪代码一样,任何长时间运行的循环或i / o都会影响主线程并使gui冻结。

class MyThread(QThread):
    def __init__(self , *args):
        QThread.__init__(self , *args)
        self.connect(self , SIGNAL("do_some_io(QString)") , self.doSomething)

    def doSomething(self ,  params):
        #do some large i/o and loops
        parent.emit( SIGNAL("process_done()") )


class MyDialog(QDialog):
    def __init__(self , *args):
        QThread.__init__(self , *args)
        self.Thread = MyThread(self)
        self.Thread.start()
        self.connect(self.btn , SIGNAL("clicked()") , self.buttonClicked)
        self.connect(self , SIGNAL("process_done()") , self.showMsgBox)

    def buttonClicked(self):
        self.Thread.emit( SIGNAL("do_some_io(QString)") , "param" )

    def showMsgBox(self):
        #show messagebox

1 个答案:

答案 0 :(得分:0)

这是因为当您发出do_some_io时,会在GUI线程中执行doSomething。在您的connect调用中,您需要将连接类型设置为QueuedConnection。这将导致消息作为事件添加到接收线程事件队列,然后它将在接收线程而不是发送线程中运行信号。

请参阅:http://doc.qt.io/qt-5/qt.html#ConnectionType-enum