首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QThread异常管理和线程竞争

QThread异常管理和线程竞争
EN

Stack Overflow用户
提问于 2016-10-11 17:33:54
回答 1查看 2.1K关注 0票数 3

我有一个GUI (PySide)应用程序,它使用QThread。我的QThread中有一个在异常发生时发出的信号,这样我就可以在主线程中处理异常。但是,启动线程的函数的其余部分仍然被执行。我尝试了wait函数来阻止执行,但是它不起作用。以下是我的实现:

QThread女儿

代码语言:javascript
复制
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()

主线程

代码语言:javascript
复制
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中引发异常时,如何停止测试函数?

EN

回答 1

Stack Overflow用户

发布于 2016-10-11 23:52:25

在您的test函数中,事件的顺序如下:

  1. 线程启动
  2. 线程的run方法被调用
  3. task_failed信号是异步发出的(即将其发送到接收方的事件队列)
  4. 线程的run方法返回
  5. 如果在这里调用线程的wait方法,它将立即返回True,因为没有什么可等待的(即run已经返回)
  6. 打印一条消息,然后test返回
  7. 控件返回到事件循环,并处理task_failed信号。
  8. on_failed中引发异常

在这里很难看到有什么可以反对的。假设您不想在工作线程运行时阻塞gui,所以按时间顺序处理任何异常都是非常有意义的。但要做到这一点,控制必须返回到主线程的事件循环,这意味着test函数必须立即返回。如果要在线程启动后运行一些代码,请将插槽连接到其started信号。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39983224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档