【问题标题】:threading method in imageprocessing PyQt application图像处理 PyQt 应用程序中的线程方法
【发布时间】:2017-03-15 01:31:26
【问题描述】:

我开发了一个程序,它不断地“监视”一个特定的文件夹,当一些图像被复制到那个文件夹中时,从另一个类中调用一个函数并开始处理。这些图像很大的问题,所以每当图像处理功能启动时,用户界面都会冻结,直到过程结束。我了解到 QThread 可能是解决方案,但是当我在课堂上有很多功能时,我无法弄清楚如何应用......

要更具体,请参阅步骤顺序。

class Main(QtGui.QMainWindow):
    def __init__():

    functions = Functions()
    ...
    self.something.signal.connect(self.functions.doStuff)

class Functions(QtCore.QObject):
    def __init__():

    imProc = ImageProcessing() 

    def doStuff():
        initialImage = loadimage(...)
        processedImage = imProc.process1(initialImage)

class ImageProcessing(QtCore.QObject) 
    def __init__(): 

    def process1(original_image):
        do maximum likelihood on the image
        return segmented image

    def process2(original_image):

        do another image processing task
        return segmented image

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = Main()
    main.show()
    main.exec_()

问题是当 process1() 运行时主窗口冻结...您能告诉我如何在后台单独运行 process1() 吗?

提前致谢!

【问题讨论】:

  • 如果不知道要在线程中运行的方法的内容,就无法以线程安全的方式回答。
  • @three_pineapples 我想在单独的线程上运行包含最大似然分割方法的 function1() 并返回分割后的图像。你怎么看,有可能吗?
  • @three_pineapples 我无法弄清楚如何运行 process1(image) 函数,它不会冻结主 UI。我不必在 ui 上显示任何内容,所以基本上我不需要发出任何值(或者我错了?)。该函数返回一个图像,然后将其保存到从中复制 original_image 的文件夹中。我必须详细说明最大似然算法吗?或者你需要什么信息?谢谢

标签: python multithreading pyqt qthread


【解决方案1】:

好的,所以我想通了。我给出一个通用的描述我是如何解决它的:

首先是我的 ImageProcessing 类...

class ImageProcess(QtCore.QThread):
    def __init__(self):
        QtCore.QThread.__init__(self)

    def __del__(self):
        self.exiting = True
        self.wait()

    def run(self):
        #machine learning algorithm, which results a processed image...
        self.emit( QtCore.SIGNAL('image'), processedImage) 
        return 

我有我的函数类...

class Functions(QtCore.QObject):
    def __init__():

        self.improc = ImageProcess()
        self.connect(self.improc, SIGNAL("image"), self.processImage)

        self.segmented_image = []

        self.improc.setPath(self.image)
        self.improc.start()

    def processImage(self,seg_img):    
        self.segmented_image = seg_img

然后像往常一样设置QMainWindow...

希望它对正在努力使用 Qthread、信号槽应用程序的人有所帮助...

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多