我有一个GUI (PySide)应用程序,它使用QThread。我的QThread中有一个在异常发生时发出的信号,这样我就可以在主线程中处理异常。但是,启动线程的函数的其余部分仍然被执行。我尝试了wait函数来阻止执行,但是它不起作用。以下是我的实现:
QThread女儿
class LongTaskThread(QtCore.QThread):
task_finished = QtCore.Signal()
task_failed = QtCore.Signal(Exception)
def __init__(self, allow_log=True, test_mode=False, parent=None):
QtCore.QThread.__init__(self, parent)
def run(self):
self.task_failed.emit(Exception())
def wait_with_gui_refresh(self):
while self.isRunning():
time.sleep(0.1)
if not self.test_mode:
QtGui.QApplication.processEvents()主线程
def test():
my_thread = LongTaskThread()
my_thread.task_finished.connect(on_finished)
my_thread.task_failed.connect(on_failed)
my_thread.start()
# my_thread.wait() <---- tentative 1
# my_thread.wait_with_gui_refresh() <---- tentative 2
print('bla bla bla bla')
def on_finished)():
pass
def on_failed(err):
raise err我希望print永远不会被击中,但是无论我是使用wait函数还是wait_with_gui_refresh函数,还是什么都没有,打印总是被打印出来的。
在QThread中引发异常时,如何停止测试函数?
发布于 2016-10-11 23:52:25
在您的test函数中,事件的顺序如下:
run方法被调用task_failed信号是异步发出的(即将其发送到接收方的事件队列)run方法返回wait方法,它将立即返回True,因为没有什么可等待的(即run已经返回)test返回task_failed信号。on_failed中引发异常在这里很难看到有什么可以反对的。假设您不想在工作线程运行时阻塞gui,所以按时间顺序处理任何异常都是非常有意义的。但要做到这一点,控制必须返回到主线程的事件循环,这意味着test函数必须立即返回。如果要在线程启动后运行一些代码,请将插槽连接到其started信号。
https://stackoverflow.com/questions/39983224
复制相似问题