我有一个用户界面,其中导入了大文件。这可能需要一段时间,因此文件的导入是在(或几个)工作线程中完成的。但是,在导入文件时,用户应该能够在导入文件时查看它们(即使用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()