PySide2 QThread 正在冻结 UI

PySide2 QThread is freezing the UI

我正在尝试 运行 使用 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 的调用,这奇怪地没有冻结 UI。有什么我需要 to/can 更改以避免 scan 阻塞吗?

感谢 Grzegorz Bokota 的帮助,我了解到 C++ 库没有发布 GIL(不同于其他 C/C++ 绑定,如 OpenCV 和 NumPy。)

为了解决这个问题,我在 setup.pysubmitted the patch to upstream.

中的 swig_opts 数组中添加了 '-threads'

此补丁发布为 version 1.3.3.2 of pyattyscomm.