我有一个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秒来读取所有文件。
在run函数中,变量'num‘影响速度。如果num = 4,则读取所有文件大约需要0.5s。当然,它加快了我的阅读速度。
然后,我需要在GUI中更新进度。在我的想法中,我将在函数'readfile‘中发出一个信号,函数'updateText’将接收该信号,然后在图形用户界面中更新进度。信号发射已经在函数'readfile‘中注解(self.signal.finished.emit()),因为它会使图形用户界面崩溃。
那么,如何在GUI中更新进度呢?
发布于 2018-06-01 18:57:00
试试看:
def readfile(self, name):
#time.sleep(0.01)
QThread.msleep(10)
# self.signal.finished.emit()
self.finished.emit()https://stackoverflow.com/questions/50639138
复制相似问题