【问题标题】:Can you create a separate QThread class and only call a specific function from it?您可以创建一个单独的 QThread 类并仅从中调用特定函数吗?
【发布时间】:2016-11-10 04:47:37
【问题描述】:

我尝试尽可能多地阅读有关 PyQt4 的 QThread 和工作线程的想法。我的问题是,不是通过blahblah.start() 命令构建一个QThread 类来从def run(self): 运行其中的所有内容,而是有一种方法可以创建具有例如4 个函数并且您只调用函数2 和然后立即关闭该线程?

【问题讨论】:

    标签: pyqt4 qthread


    【解决方案1】:

    子类化QThread 是一种通常是discouraged 的做法,尽管经常使用。 [见下方评论]

    在我看来,this 是如何在 pyqt 中使用线程的一个很好的例子。您将创建一个 Worker 和一个 Thread,其中 Worker 是 QObject 类型的某个通用类,而 Thread 是您没有子类化的 QThread。然后将 Worker 移至 Threat 并启动它。

        self.worker = WorkerObject()
        self.worker_thread = QtCore.QThread()
        self.worker.moveToThread(self.worker_thread)
        self.worker_thread.start()
    

    在 Worker 内部你基本上可以做任何你想做的事情,它可以有任意多个方法等等。
    要记住的一件大事是 Worker 需要与主循环分开。所以这些方法不应该返回任何在主循环中使用的东西(最好不要返回任何东西),并且应该使用信号和槽来收集 Worker 的结果。

    self.button_start.clicked.connect(self.worker.startWork)
    self.button_do_something_else.clicked.connect(self.worker.function2)
    self.worker.signalStatus.connect(self.updateStatus)
    

    还要确保不要在 worker 内部使用任何 PyQt/GUI 对象,因为这也会通过 PyQt 本身在 Worker 和主循环之间建立一座桥梁。

    【讨论】:

    • 不鼓励子类化QThread。当前的Qt documentation 使用这两种方法。您链接到的博客文章现在已经过时,因为它引用了一些现在已经重写的旧文档。有关详细信息,请参阅this blog post
    • @ekhumoro 同意,尽管我认为子类化仍然很危险,至少对于像我这样不熟悉 PyQt 世界的每一个细微差别的人来说。
    • 子类化从来都不是危险的。多线程中真正的“危险”来自未能确保线程安全。在 Qt 中,这通常涉及尝试在主线程之外执行 gui 操作。关于该特定主题的 SO 问题没有尽头......
    • SO...有没有很好的例子参考?我希望看到一些实际应用来扩展我的专业知识
    猜你喜欢
    • 2022-01-19
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2020-05-06
    相关资源
    最近更新 更多