我正在尝试创建一个简单的线程应用程序,其中我有一个执行一些长时间处理的方法和一个显示加载栏和取消按钮的小部件。
我的问题是,无论我如何实现线程,它实际上并没有线程 - 一旦线程启动,UI 就会被锁定。我已经阅读了所有教程并发布了有关此内容的文章,我现在求助于询问社区尝试解决我的问题,因为我不知所措!
最初我尝试子类化 QThread 直到互联网说这是错误的。然后我尝试了 moveToThread 方法,但它产生了零差异。
初始化代码:
loadingThreadObject = LoadThread(arg1)
loadingThread = PythonThread()
loadingThreadObject.moveToThread(loadingThread)
loadingThread.started.connect(loadingThreadObject.load)
loadingThread.start()
PythonThread 类(显然 QThreads 在 pyQt 中有问题,除非你这样做否则不会启动):
class PythonThread (QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
def start(self):
QtCore.QThread.start(self)
def run(self):
QtCore.QThread.run(self)
加载线程类:
class LoadThread (QtCore.QObject):
results = QtCore.Signal(tuple)
def __init__ (self, arg):
# Init QObject
super(QtCore.QObject, self).__init__()
# Store the argument
self.arg = arg
def load (self):
#
# Some heavy lifting is done
#
loaded = True
errors = []
# Emits the results
self.results.emit((loaded, errors))
非常感谢任何帮助!
谢谢。 本。
最佳答案
问题出在我使用的 SQL 库(一个自定义的内部解决方案),结果证明它不是线程安全的,因此执行了阻塞查询。
如果您遇到类似的问题,请先尝试删除 SQL 调用并查看它是否仍然阻塞。如果这解决了阻塞问题,请尝试通过 MySQLdb
(或您正在使用的数据库类型的等效项)使用原始 SQL 重新引入您的查询。这将诊断问题是否与您选择的 SQL 库有关。
关于python - pyqt QThread阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20075368/