PySide2 QThread 正在冻结 UI
Posted
技术标签:
【中文标题】PySide2 QThread 正在冻结 UI【英文标题】:PySide2 QThread is freezing the UI 【发布时间】:2019-07-17 20:57:02 【问题描述】:我正在尝试使用 Qt 在后台运行一个长时间的阻塞调用。 (确切地说,pyattyscomm.AttysScan
的scan
方法。)我认为我应该使用QThread
,并想出了以下内容:
import pyattyscomm
from PySide2.QtCore import QThread, Signal
class DataCollectionThread(QThread):
attys_ready = Signal()
def __init__(self, parent=None):
super().__init__(parent)
self.scanner = pyattyscomm.AttysScan()
def run(self):
self.scanner.scan() # this is a long, blocking call
self.attys_ready.emit()
但是,当我 start
线程(来自小部件中的某些逻辑)时,GUI 会挂起,直到 scan
方法完成(即一段时间)。
我用time.sleep(10)
替换了对scan
的调用,奇怪的是它并没有冻结用户界面。我需要/可以更改什么以避免scan
阻塞吗?
【问题讨论】:
你测试了哪个系统? 这是在 Linux 机器上。我可以稍后在其他机器上尝试测试(访问不那么容易。) 我不知道确切的问题是什么,但可能是 GIL (wiki.python.org/moin/GlobalInterpreterLock) 的问题。 swig 文档中标注了调用 C/C++ 函数时默认不释放 GIL,但需要进行配置。 swig.org/Doc4.0/Python.html 可能需要联系 Attys 的作者修复。 【参考方案1】:感谢Grzegorz Bokota 的帮助,我了解到 C++ 库没有发布 GIL(与 OpenCV 和 NumPy 等其他 C/C++ 绑定不同。)
为了解决这个问题,我在setup.py
和submitted the patch to upstream.的swig_opts
数组中添加了'-threads'
此补丁发布为version 1.3.3.2 of pyattyscomm.
【讨论】:
以上是关于PySide2 QThread 正在冻结 UI的主要内容,如果未能解决你的问题,请参考以下文章
Pyside2 QGuiApplication,Gui冻结按钮点击
QT QThread::isrunning 冻结程序在 Pi
当 GUI 冻结时显示带有 QThread 的 QMessageBox