简体   繁体   English

QThread 无法正常工作并且 pyqt gui 应用程序冻结

[英]QThread not work correctly and pyqt gui application freeze

I'm writing python gui application that process a image and send image color from serial port and show the results but unfortunately my gui freeze.我正在编写 python gui 应用程序,它处理图像并从串行端口发送图像颜色并显示结果,但不幸的是我的 gui 冻结了。 i try using QApllication.processEvents and it is work but my program speed slow and speed is so important to me and every one second one iteration should be complete And then i use QThread and my application still freeze.我尝试使用 QApllication.processEvents,它可以工作,但我的程序速度很慢,速度对我来说非常重要,每一秒一次迭代应该完成然后我使用 QThread,我的应用程序仍然冻结。 Here is my code:这是我的代码:

class Worker(QObject):

    progress = pyqtSignal(int)
    gui_update = pyqtSignal()

    def __init__(self, knot, lay, baft):
        super().__init__()
        self.knot = knot
        self.lay = lay
        self.baft = baft

    def run(self):

        while self.knot <= knotter_width:
            color_to_send = []
            for i in range(1, number_of_knotter + 1):
                color_to_send.append(self.baft["knotters"][i][self.lay][self.knot])

            self.progress.emit(self.knot)
            self.gui_update.emit() # for updating gui but not work

QThread setups: QThread 设置:

self.thrd = QThread()
    self.worker = Worker(self.knot, self.lay, self.baft)
    self.worker.moveToThread(self.thrd)
    self.thrd.started.connect(self.worker.run)
    self.worker.progress.connect(self.progress)
    self.worker.gui_update.connect(self.knotters_status)
    self.worker.finish.connect(self.finished)
    self.worker.ex.connect(self.thrd.quit)
    self.worker.ex.connect(self.worker.deleteLater)
    self.thrd.finished.connect(self.thrd.deleteLater)

    self.thrd.start()

After three days of research i found that after setting up thread you need to call processEvents() just after creating thread object and in that situation it doesn't cause slowing down and every thing work perfectly.经过三天的研究,我发现在设置线程后,您需要在创建线程 object 之后调用processEvents() ,在这种情况下,它不会导致速度变慢,并且一切正常。 note: you should put the parameters in init function.注意:你应该把参数放在init function中。

this is my final code:这是我的最终代码:

class Thrd(QThread):

progress = pyqtSignal(int)
gui_update = pyqtSignal()
finish = pyqtSignal(bool)
ex = pyqtSignal()

def __init__(self, knot, lay, baft):
    super().__init__()
    self.knot = knot
    self.lay = lay
    self.baft = baft

def run(self):

    while condition:

        # some process

        self.progress.emit(self.knot)
        self.gui_update.emit()
        time.sleep(0.05) # give a little time to update gui

    self.finish.emit(True)
    self.ex.emit()

And setting up part:并设置部分:

self.thrd = Thrd(self.knot, self.lay, self.baft)
app.processEvents()
self.thrd.progress.connect(self.progress)
self.thrd.gui_update.connect(self.knotters_status)
self.thrd.finish.connect(self.finished)
self.thrd.ex.connect(self.thrd.quit)
self.thrd.finished.connect(self.thrd.deleteLater)
self.thrd.finished.connect(self.stop)
self.thrd.start()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM