QThread 没有实现 运行 方法
QThread without implementing run method
我对 (pyqt) 中的 QThreads 有一个奇怪的问题。
我通过实现 运行 方法和 运行 在其中无限循环来测试 QThread。它不影响主线程 (gui)。但是当我发出信号时
就像下面的伪代码一样,任何长 运行ning 循环或 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
这是因为当您发出 do_some_io
时,doSomething
是在 GUI 线程中执行的。在您的连接调用中,您需要将连接类型设置为 QueuedConnection。这将导致消息作为事件添加到接收线程事件队列中,然后它将 运行 接收线程而不是发送线程中的信号。
我对 (pyqt) 中的 QThreads 有一个奇怪的问题。 我通过实现 运行 方法和 运行 在其中无限循环来测试 QThread。它不影响主线程 (gui)。但是当我发出信号时 就像下面的伪代码一样,任何长 运行ning 循环或 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
这是因为当您发出 do_some_io
时,doSomething
是在 GUI 线程中执行的。在您的连接调用中,您需要将连接类型设置为 QueuedConnection。这将导致消息作为事件添加到接收线程事件队列中,然后它将 运行 接收线程而不是发送线程中的信号。