Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何使用线程池通知主线程进行并行计算(PyQt)_Multithreading_Parallel Processing_Pyqt - Fatal编程技术网

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

Multithreading 如何使用线程池通知主线程进行并行计算(PyQt),multithreading,parallel-processing,pyqt,Multithreading,Parallel Processing,Pyqt,我有一个for循环来读取大量图像,我想使用多线程来加速。我可以从网上找到很多关于QThread的例子。然而,这些示例中的许多都不是为加速而设计的 最后,我找到了一个使用多线程方法加速for循环的例子。代码是: from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * import sys import multiprocessing from multiprocessing.pool im

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

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

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秒来读取所有文件

在运行函数中,变量“num”会影响速度。如果num=4,读取所有文件大约需要0.5秒。当然,这会加快我的阅读速度

然后,我需要更新GUI中的进度。在我看来,我将在函数“readfile”中发出一个信号,函数“updateText”将接收该信号,然后在GUI中更新进度。在函数“readfile”中对信号发射进行了注释(self.signal.finished.emit()),因为它会破坏GUI

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

试试:

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

它不起作用。仅当读取200个文件完成时,文本才会更新