pyqt - 如何确保我的所有计算都在单独的Qthread中运行?

时间:2017-02-08 23:16:50

标签: python qt pyqt qthread

我一直在阅读有关如何正确地"使用QThreads,我变得有点困惑。我一直在阅读,很多人一直在说,创建一个QThread,但也创建了一个QObject的工作者。然后使用movetoThread将Qobject移动到Qthread。

我有点困惑,因为我在stackoverflow上看到的所有例子都不是真的那样。

如果这是我的代码:

class worker(QThread):
    def __init__(self):
        Qthread.__init__(self)

    def run(self):
        do_work()
        a = 3

    def do_work(self):
        b = 2

        self.emit(SIGNAL("work_done"),b)

class MyApp(QtGui.QMainWindow):
    QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.worker_thread = worker()

        self.connect(self.worker,SIGNAL('work_done'),self.done)

        self.worker_thread.start()

    def done(self,b)

        print "the value from the worker is: " + str(b)

此代码是否会在主线程的另一个线程SEPARATE中完成变量ab的赋值?或者这不是真的,因为我的worker_thread对象存在于主线程中?

1 个答案:

答案 0 :(得分:-1)

在另一个线程中运行某些代码的更好方法不是子类QThread,而是将实现其他代码的对象移动到一个单独的线程中。

在您的情况下,您的worker对象将直接从QObject继承,以便您可以通过信号和插槽跨线程与其进行通信。然后创建一个标准的,开箱即用的QThread并将worker移动到它。如果需要,使用信号/插槽发送工作人员数据,并在准备好后检索其结果。

我认为你的困惑源于这个想法:QThread对象管理一个单独的线程,但对象本身存在于创建该对象的任何线程中第一名。例如,在主线程中创建它意味着QThread也在主线程中,但是您的worker对象将位于由QThread对象管理的线程中(在您移动它之后)当然,那里。)

查看this post了解更多详情和解释。