我在(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
答案 0 :(得分:0)
这是因为当您发出do_some_io
时,会在GUI线程中执行doSomething
。在您的connect调用中,您需要将连接类型设置为QueuedConnection。这将导致消息作为事件添加到接收线程事件队列,然后它将在接收线程而不是发送线程中运行信号。