GUI очень вялый, используя PyQt и Qthreads - PullRequest
3 голосов
/ 08 июля 2011

У меня проблема с поддержанием отзывчивости GUI с использованием PyQt и Qthreads.То, что я делаю, это порождаю рабочий Qthread из графического интерфейса, который является тяжелым процессором.Рабочий Qthread посылает сигнал, содержащий числовое значение в каждом цикле.В графическом интерфейсе сигнал связан с функцией обновления, которая принимает числовое значение и перерисовывает графический интерфейс.Я использую стандартный механизм Qt SIGNAL / SLOT.

Все это похоже на документацию, которую я нашел в Интернете относительно PyQt, графических интерфейсов и Qthreads.Проблема в том, что рабочий поток запускает сигнал так часто, что графический интерфейс становится очень вялым.Решение состоит в том, чтобы рабочий поток запускал сигнал реже, но я хотел бы получить быстрое обновление прогресса.

Это все кажется очень стандартным материалом, и все же я не могу найти правильныйрешение.Возможно, мне нужно изменить дизайн?

Любая помощь будет оценена.

Код:

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 ]

2 голосов
/ 12 июля 2011

Добавление qApp.processEvents () в основной цикл рабочего потока, похоже, решает проблему.

2 голосов
/ 08 июля 2011

Решение состоит в том, чтобы рабочий поток запускал сигнал реже, но я хотел бы получить быстрое обновление прогресса.

Поскольку скорость реакции человека намного нижечем скорость обработки данных на компьютере, это лучшее или, по крайней мере, самое простое решение.Вы все еще можете получить «быстрое обновление прогресса», даже если графический интерфейс перерисовывается только один раз, скажем, 1/10 ~ 1/30-й секунды.

...