pyqt QThread阻塞主线程

Ben*_*Ben 5 python multithreading pyqt

我正在尝试创建一个简单的线程应用程序,其中我有一个执行一些长时间处理的方法和一个显示加载栏和取消按钮的小部件。

我的问题是,无论我如何实现线程,它实际上都不会线程化 - 一旦线程启动,UI 就会被锁定。我已经阅读了有关此问题的所有教程和帖子,现在我正在求助于社区尝试解决我的问题,因为我不知所措!

最初我尝试对 QThread 进行子类化,直到互联网说这是错误的。然后我尝试了 moveToThread 方法,但效果为零。

初始化代码:

loadingThreadObject = LoadThread(arg1)
loadingThread = PythonThread()
loadingThreadObject.moveToThread(loadingThread)
loadingThread.started.connect(loadingThreadObject.load)
loadingThread.start()
Run Code Online (Sandbox Code Playgroud)

PythonThread 类(显然 QThreads 在 pyQt 中存在 bug,除非你这样做,否则不会启动):

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)
Run Code Online (Sandbox Code Playgroud)

加载线程类:

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))
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

谢谢。本.

Ben*_*Ben 2

问题出在我使用的 SQL 库(一个自定义的内部解决方案)上,结果证明它不是线程安全的,因此执行了阻塞查询。

如果您遇到类似的问题,请首先尝试删除 SQL 调用并查看它是否仍然阻塞。MySQLdb如果这解决了阻塞问题,请尝试使用原始 SQL via (或您正在使用的数据库类型的等效项)重新引入查询。这将诊断问题是否与您选择的 SQL 库有关。