为了账号安全,请及时绑定邮箱和手机立即绑定

将stdout和stderr从辅助线程重定向到PyQt4 QTextEdit

将stdout和stderr从辅助线程重定向到PyQt4 QTextEdit

四季花海 2019-09-02 14:49:28
堆栈溢出。再一次,我在一个迫切需要的时候来找你,在疯狂的边缘岌岌可危地摇摇欲坠。这个问题 - 从标题中可以看出 - 是我在这里回答的其他几个问题的合并。我有一个PyQt应用程序,我想将stdout和stderr流重新路由到我的GUI中的QTextEdit,没有延迟。这很有效,但有一点需要注意:如果在CPU处理相对较长的方法时多次更新stdout或stderr,则当主线程返回到应用程序循环时,所有更新都会同时显示。不幸的是,我有一些方法需要20秒才能完成(网络相关),因此应用程序变得无响应 - 并且QTextEdit不会更新 - 直到它们完成。为了解决这个问题,我将所有GUI处理委托给主线程,并且我已经产生了第二个线程以处理更长的网络操作,使用pyqtSignals通知主线程工作何时完成并通过回来的结果。当我开始测试以这种方式编写的代码时,python解释器立刻开始崩溃而没有任何警告。这是非常令人讨厌的地方:Python正在崩溃,因为 - 使用上面包含的链接中的类 - 我已经将sys.stdout / err流分配给QTextEdit小部件; PyQt小部件不能从除应用程序线程之外的任何线程修改,并且由于对stdout和stderr的更新来自我创建的辅助工作线程,因此它们违反了此规则。我已经注释掉了我重定向输出流的代码部分,果然,程序运行没有错误。这让我回到原点,让我陷入困惑的境地; 假设我继续在主线程中处理GUI相关操作并处理辅助线程中的计算和更长时间的操作(我已经理解这是在用户触发事件时阻止应用程序阻塞的最佳方法),我该怎么办将Stdout和Stderr从两个线程重定向到QTextEdit小部件?上面链接中的类对于主线程来说效果很好,但是当更新来自第二个线程时,由于上述原因会杀死python。
查看完整描述

2 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

如果python模块是线程安全的,那么你可以在没有锁的情况下从多个线程中使用它。我有点不确定一个模块是否是线程安全的,意味着用它创建的对象也是线程安全的。大多数东西都可以使用a Lock()(例如我使用的库是h5py,zeromq,pandas)来制作线程安全的,但显然不是所有的库都可以通过锁(也就是Qt不能)来保证线程安全。您必须根据具体情况对其进行处理,并询问图书馆的用户/开发人员。

查看完整回答
反对 回复 2019-09-02
  • 2 回答
  • 0 关注
  • 597 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信