PySide2 QThread 正在冻结 UI

Posted

技术标签:

【中文标题】PySide2 QThread 正在冻结 UI【英文标题】:PySide2 QThread is freezing the UI 【发布时间】:2019-07-17 20:57:02 【问题描述】:

我正在尝试使用 Qt 在后台运行一个长时间的阻塞调用。 (确切地说,pyattyscomm.AttysScanscan 方法。)我认为我应该使用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 Qthread 崩溃

Pyside2 QGuiApplication,Gui冻结按钮点击

QT QThread::isrunning 冻结程序在 Pi

当 GUI 冻结时显示带有 QThread 的 QMessageBox

使用 pyinstaller 或 fbs 冻结应用程序会更改 pyside2 应用程序的默认配色方案

PySide2 使用 QProgressBar 作为信号参数