在pyQt5中使用线程,将任务推送到队列的前面

时间:2017-07-26 07:37:25

标签: python qt pyqt pyqt5 qthread

我有一个用户界面,其中导入了大文件。这可能需要一段时间,因此文件的导入是在(或几个)工作线程中完成的。但是,在导入文件时,用户应该能够在导入文件时查看它们(即使用matplotlib将文件中的某些数据绘制到UI中)。

如果绘图操作不是在单独的线程中完成,则在文件导入几乎完成之前它不会运行。但是如果它在工作线程中完成,则操作只是放在队列的末尾。

所以,我正在寻找一种方法将新操作推送到队列的前面,或者(甚至更好)在工作线程中导入文件的同时在GUI线程中运行操作。

最小代码示例:

class WorkerSignals(QObject):
    finished = pyqtSignal()
    error = pyqtSignal(tuple)
    result = pyqtSignal(object)
    progress = pyqtSignal(int)


class Worker(QRunnable):
    def __init__(self, fn, *args, **kwargs):
        super(Worker, self).__init__()
        self.fn = fn
        self.args = args
        self.kwargs = kwargs
        self.signals = WorkerSignals()

    @pyqtSlot()
    def run(self):
        result = self.fn(*self.args, **self.kwargs)
        self.signals.result.emit(result)
        self.signals.finished.emit()

class Main(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(Main, self).__init__()
        self.setupUi(self)
        self.threadpool = QThreadPool()
        self.displayButton.clicked.connect(self.displayFile)

    def loadFiles(self):
        fpaths, _ = QFileDialog.getOpenFileNames(self, '')
        for fpath in fpaths:
            self.workerStarting("Load file")
            worker = Worker(load_files, fpath)
            worker.signals.result.connect(self.fileLoaded)
            self.threadpool.start(worker)

    def fileLoaded(self, file):
        """Add filename to the UI"""
        self.uiListFiles.addItem(file.name)

    def displayFile():
        self.figImage.clear()
        self.figImage.imshow(...)
        self.figCanvas.draw()

0 个答案:

没有答案