gpt4 book ai didi

python - 在执行 cpu 密集型任务时如何保持 pyqt GUI 响应?

转载 作者:行者123 更新时间:2023-12-05 08:10:03 25 4
gpt4 key购买 nike

我正在编写一个数据采集程序,并且我有兴趣让 GUI 始终保持响应。这就是为什么我使用 QThreads 来完成这项工作。尽管与在单个线程中完成整个工作的情况相比结果稍微好一些,但我的 GUI 仍然挂起,直到任务完成。这是代码的相关部分:

import numpy as np
from PyQt4 import QtGui, QtCore
import h5py as hdf
import tifffile as tiff


class MyWidget(QtGui.QFrame):

def __init__(self, *args, **kwargs):

super(MyWidget, self).__init__(*args, **kwargs)
self.convertButton = QtGui.QPushButton('Convert to TIFF')
self.convertButton.clicked.connect(self.convertToTiff)
recGrid = QtGui.QGridLayout()
self.setLayout(recGrid)
recGrid.addWidget(self.convertButton, 0, 0)

def convertToTiff(self):
self.converterThread = QtCore.QThread()
self.converter = TiffConverter(self.savename, self.dataname)
self.converter.moveToThread(self.converterThread)
self.converterThread.started.connect(self.converter.run)
self.converterThread.start()


class TiffConverter(QtCore.QObject):

def __init__(self, filename, dataname, *args, **kwargs):
super(TiffConverter, self).__init__(*args, **kwargs)
self.filename = filename
self.dataname = dataname
self.file = hdf.File(self.filename, mode='r')

def run(self):
tiff.imsave(self.filename, self.file[self.dataname])
self.file.close()


if __name__ == '__main__':
app = QtGui.QApplication([])

win = MyWidget()
win.show()

app.exec_()

我知道 GUI 卡在 tiff.imsave(self.filename, self.file[self.dataname]) 并且我很熟悉 QThreads 并没有真正进行并行计算.这可能是 GUI 挂起的原因吗?还是像我这样共享变量有问题?是否有针对此类情况的解决方法?

最佳答案

您可以使用线程来解决您的问题。

您可以将您的图像编写功能放在一个新线程中,然后该任务将独立于您的 UI 部分,因此它不会滞后。

我已经完成了,如果您需要任何进一步的帮助,请告诉我。

class ThreadLiveViewProcessing(QThread):
def __init__(self):
super(ThreadLiveViewProcessing, self).__init__()




self.is_ThreadLiveViewProcessing_running = True

def run(self):
enter code here

然后您可以在您的 UI 类的 init 中创建它的实例。

class MyWidget(QtGui.QFrame):

def __init__(self, *args, **kwargs):

super(MyWidget, self).__init__(*args, **kwargs)

# Thread should never have parents.
# Create instance of Thread Class for processing in faceme.

self.thread_live_view_processing = ThreadLiveViewProcessing()

self.thread_live_view_processing.start()

... snippet ... code ... etc.

recGrid = QtGui.QGridLayout()
self.setLayout(recGrid)
recGrid.addWidget(self.convertButton, 0, 0)

您可以在需要的地方开始线程:

self.thread_live_view_processing.start()

关于python - 在执行 cpu 密集型任务时如何保持 pyqt GUI 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com