PySide2 QThread 正在冻结 UI
PySide2 QThread is freezing the UI
我正在尝试 运行 使用 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
的调用,这奇怪地没有冻结 UI。有什么我需要 to/can 更改以避免 scan
阻塞吗?
感谢 Grzegorz Bokota 的帮助,我了解到 C++ 库没有发布 GIL(不同于其他 C/C++ 绑定,如 OpenCV 和 NumPy。)
为了解决这个问题,我在 setup.py
和 submitted the patch to upstream.
中的 swig_opts
数组中添加了 '-threads'
我正在尝试 运行 使用 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
的调用,这奇怪地没有冻结 UI。有什么我需要 to/can 更改以避免 scan
阻塞吗?
感谢 Grzegorz Bokota 的帮助,我了解到 C++ 库没有发布 GIL(不同于其他 C/C++ 绑定,如 OpenCV 和 NumPy。)
为了解决这个问题,我在 setup.py
和 submitted the patch to upstream.
swig_opts
数组中添加了 '-threads'