【问题标题】:pyqt - How do I ensure that all my calculations are running in a separate Qthread?pyqt - 如何确保我的所有计算都在单独的 Qthread 中运行?
【发布时间】:2017-06-26 19:08:41
【问题描述】:

我一直在阅读有关如何“正确”使用 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)

此代码是否会在与主线程分开的另一个线程中完成变量ab 的分配?还是因为我的 worker_thread 对象存在于主线程中,所以这不是真的?

【问题讨论】:

    标签: python qt pyqt qthread


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您链接到的帖子已过时,已被QThread: You were not doing so wrong 取代。执行摘要:如果您不需要工作线程中的事件循环(通常是这种情况),只需子类QThread 并重新实现run
    • @ekhumoro 它并没有过时,它真的取决于你在单独的线程中做什么。如果您只想运行一些封装的代码,那么子类化和重新实现run() 就可以了。但是如果你想要一个可以与之通信的对象,最好使用我在这里给出的方法。
    • 不,它确实已经过时了。它说官方的 Qt 线程文档是错误的(它们不再是),它还声称“子类 [QThread] 并实现你自己的 run() 函数,是非常错误的”——这显然也是不正确的。请阅读我链接的另一篇博文以了解有关此主题的历史 - 它不是很长,并且正确反映了当前 Qt 文档中给出的建议。
    猜你喜欢
    • 2019-09-18
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    相关资源
    最近更新 更多