как уведомить основной поток, используя ThreadPool для параллельных вычислений (PyQt) - PullRequest
0 голосов
/ 01 июня 2018

У меня есть цикл for для чтения большого количества изображений, и я хочу использовать многопоточность для ускорения.Я могу найти много примеров из Интернета о QThread.Однако многие из этих примеров не предназначены для ускорения.

Наконец, я нашел пример использования многопоточного метода для ускорения цикла.И код:

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 с.Определенно, это ускорит мое чтение.

Затем мне нужно обновить прогресс в графическом интерфейсе.По-моему, я испущу сигнал в функции «readfile», а функция «updateText» получит сигнал, а затем обновит прогресс в GUI.Излучение сигнала было аннотировано (self.signal.finished.emit ()) в функции «readfile», потому что это разрушит графический интерфейс.

Итак, как обновить прогресс в графическом интерфейсе?

1 Ответ

0 голосов
/ 01 июня 2018

Попробуйте:

def readfile(self, name):
    #time.sleep(0.01)
    QThread.msleep(10)
    # self.signal.finished.emit()
    self.finished.emit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...