当PyQt4中qrunner的QThreadPool完成执行时获取通知

2024-09-29 23:33:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我设置了一个快速而肮脏的测试,在python2.7上的PyQt4中,在QThreadPool中逐个运行qrunner线程。基本上它看起来运行得很好,但是线程/池似乎不会在所有线程都完成执行之后停止QThreadPool。在

我想知道它是否像在qrunable(ProductImporter)执行完代码后从qrunable(ProductImporter)返回一些内置方法一样简单,但我似乎在文档中找不到任何东西。在

我将一些代码从QThread结构移到这个设置中,因为我不能同时运行并发线程。在

有什么想法可以让ProductImportTasks知道它的任务都已经完成了,这样我就可以在以后或者调用该类之后执行更多的代码?任何帮助将不胜感激!在

import sys
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QThreadPool, QObject, QRunnable, pyqtSignal

class WorkerSignals(QObject):
    productResult = pyqtSignal(str)

class ProductImporter(QRunnable):
    def __init__(self, product):
        super(ProductImporter, self).__init__()

        self.product = product
        self.signals = WorkerSignals()

    def run(self):
        self.signals.productResult.emit(self.product['name'])
        return

class ProductImportTasks(QObject):
    def __init__(self, products):
        super(ProductImportTasks, self).__init__()
        self.products = products
        self.pool = QThreadPool()
        self.pool.setMaxThreadCount(1)

    def process_result(self, product):
        return

    def start(self):
        for product in self.products:
            worker = ProductImporter(product)
            worker.signals.productResult.connect(view.text)
            self.pool.start(worker)

        self.pool.waitForDone()


class ViewController(QObject):
    def __init__(self, parent=None):
        super(ViewController, self).__init__(parent)

    #@pyqtSlot(str)
    def text(self, message):
        print "This is the view.text method: " + message
        return


if __name__ == "__main__":

    app = QApplication(sys.argv)
    view = ViewController()
    main = ProductImportTasks([{"name": "test1"}, {"name": "test2"}, {"name": "test3"}])
    main.start()
    sys.exit(app.exec_())

Tags: 代码nameselfinitdefproduct线程class
1条回答
网友
1楼 · 发布于 2024-09-29 23:33:10

以下是脚本的作用:

  1. 调用main.start()
  2. 创建可运行程序并启动线程池
  3. 等待所有runnables完成
  4. main.start()返回
  5. 启动应用程序事件循环

一旦事件循环启动,将处理runnables发出的信号,并打印消息。这是因为在默认情况下,通过线程发送的信号是排队的。通常,信号是同步发送的,不需要运行事件循环。在

如果您更改了信号的连接类型,并添加了一些打印语句,则应该可以清楚地看到发生了什么:

            worker.signals.productResult.connect(view.text, Qt.DirectConnection)
            self.pool.start(worker)

        self.pool.waitForDone()
        print('finished')
        ...

    main.start()
    print('exec')
    sys.exit(app.exec_())

相关问题 更多 >

    热门问题