首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用ThreadPool通知主线程进行并行计算(PyQt)

如何使用ThreadPool通知主线程进行并行计算(PyQt)
EN

Stack Overflow用户
提问于 2018-06-01 16:26:34
回答 1查看 363关注 0票数 0

我有一个for循环来读取大量的图像,我想使用多线程来加速。我可以从互联网上找到很多关于QThread的例子。然而,这些示例中的许多都不是为加速而设计的。

最后,给出了一个使用多线程方法加速for循环的例子。代码是:

代码语言:javascript
复制
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
import multiprocessing
from multiprocessing.pool import ThreadPool
from multiprocessing.dummy import Pool as DummyPool
from multiprocessing import Pool as ProcessPool
import time


class MainWindow(QMainWindow):
    finished = pyqtSignal()
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QDicomLabel Test")
        self.resize(500, 500)

        widget = QWidget()
        self.setCentralWidget(widget)

        layout = QHBoxLayout()
        widget.setLayout(layout)

        btn = QPushButton('run')
        layout.addWidget(btn)

        label = QLabel('0')
        layout.addWidget(label)
        self.label = label
        btn.clicked.connect(self.run)

        self.num = 0

        self.finished.connect(self.updateText)

    def run(self):

        num = 4
        p = ThreadPool(num)
        start_time = time.time()
        ret = p.map(self.readfile, range(200))
        p.close()
        p.join()
        print("thread_pool  %d, costTime: %fs ret.size: %d" % (num, (time.time() - start_time), len(ret)))

    def readfile(self, name):
        time.sleep(0.01)
        # self.signal.finished.emit()

    def updateText(self):
        self.num = self.num + 1
        self.label.setText(str(self.num))
        # QCoreApplication.processEvents()

app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

在上面的代码中,我需要读取200张图片,我假设读取每个文件需要0.01秒。因此,我们需要大约2秒来读取所有文件。

在run函数中,变量'num‘影响速度。如果num = 4,则读取所有文件大约需要0.5s。当然,它加快了我的阅读速度。

然后,我需要在GUI中更新进度。在我的想法中,我将在函数'readfile‘中发出一个信号,函数'updateText’将接收该信号,然后在图形用户界面中更新进度。信号发射已经在函数'readfile‘中注解(self.signal.finished.emit()),因为它会使图形用户界面崩溃。

那么,如何在GUI中更新进度呢?

EN

回答 1

Stack Overflow用户

发布于 2018-06-01 18:57:00

试试看:

代码语言:javascript
复制
def readfile(self, name):
    #time.sleep(0.01)
    QThread.msleep(10)
    # self.signal.finished.emit()
    self.finished.emit()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50639138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档