使用PyQt和Qthreads,GUI非常缓慢

时间:2011-07-08 16:29:47

标签: python user-interface pyqt4 qthread

我在使用PyQt和Qthreads保持GUI响应时遇到问题。我所做的是从GUI生成一个工人Qthread,它是cpu很重的。工作人员Qthread在每个周期发送一个包含数值的信号。在GUI中,信号连接到更新功能,该功能获取数值并重新绘制GUI。我使用标准的Qt SIGNAL / SLOT机制。

这一切似乎与我在网上发现的关于PyQt,GUI和Qthreads的文档一致。问题是工作线程如此频繁地触发信号,GUI变得非常迟缓。解决方案是让工作线程触发信号的频率降低,但我希望快速更新进度。

这一切似乎都非常标准,但我找不到合适的解决方案。可能我需要改变设计?

任何帮助都将不胜感激。

代码:

import calculator as ca

class GUI(QMainWindow):

    def __init__(self, config):
        QMainWindow.__init__(self)
        self.w_thread = WorkerThread()
        self.connect(self.w_thread, SIGNAL("update(PyQt_PyObject)"), self.update_gui)

    def start_calc(self):
        self.w_thread.start()

    def update_gui(self, progress_value):
        self.progress_value = progress_value
        self.repaint()

    def paintEvent(self, event):
        paint = QPainter()
        paint.begin(self)
        paint.drawText(300, 300, "progress: " + str(self.progress_value))
        paint.end()


class WorkerThread(QThread):

    def __init__(self):
        QThread.__init__(self)

    def __del__(self):
        self.wait()

    def run(self):
        ca.run_calculations(self)



*************** calculator.py ***************

def run_calculations(thread=None):

    while current_cycle < total_cycles:
        do_calculations()
        if current_cycle % 100 == 0:
            thread.emit(SIGNAL("update(PyQt_PyObject)"), current_progress_value)
        qApp.processEvents()
        current_cycle += 1

2 个答案:

答案 0 :(得分:2)

  

解决方案是让工作线程触发信号的频率降低,但我希望快速更新进度。

因为人类的反应速度比计算机的处理速度慢得多,所以这是最好的,或者至少是最简单的最简单的解决方案。您仍然可以获得“快速更新进度”,即使GUI仅重新绘制一次,例如,1 / 10th / 1/30秒。

答案 1 :(得分:2)

在工作线程的主循环中添加qApp.processEvents()似乎可以解决问题。