PySide2 GUI медленный при использовании moveToThread QThread - PullRequest
0 голосов
/ 14 февраля 2019

Я создаю приложение PySide2.Я использую функциональность moveThThread в QThread, создав подкласс QObject и передав его в QThread.

У меня есть две кнопки (Пуск / Стоп), индикатор выполнения и редактирование текста.

На кнопке Пуск я делаютяжелая интенсивная задача в потоке.При нажатии кнопки «Стоп» я прекращаю выполнение интенсивной задачи, проверяя значение флага.

Проблема заключается в том, что во время выполнения моей задачи в потоке графический интерфейс медленно реагирует (не зависает)

IЯ не уверен, в чем проблема.Ниже приведены мои файлы кода.

Любые указатели были бы полезны.

PS: У меня также есть копия кода здесь: https://github.com/williamcharles/testthreading

app.py

from PySide2.QtWidgets import QApplication
import sys
from mainwindow import MainWindow


def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()


if __name__ == "__main__":
    main()

mainwindow.py

from PySide2.QtWidgets import QMainWindow
from uiloader import loadUi
from PySide2.QtCore import QThread, Slot, Signal
from PySide2.QtGui import QCloseEvent
from util import logthread
from worker import Worker


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        logthread('MainWindow.__init__')
        QMainWindow.__init__(self, parent)
        self.widget = loadUi('window.ui', self)
        self.setFixedSize(self.size())

        self.thread = QThread()
        self.thread.started.connect(self.threadStarted)
        self.thread.finished.connect(self.threadFinished)

        self.worker = Worker()
        self.worker.moveToThread(self.thread)

        self.thread.start()

        self.worker.qtextedit.connect(self.qtextedit_addtext)
        self.worker.stop.connect(self.endNow)
        self.worker.progress.connect(self.updateProgressBar)

    @Slot()
    def on_pbStart_clicked(self):
        logthread('MainWindow.on_pbStart_clicked')
        self.widget.pbrProgress.setRange(0, 0)

        self.teErrors.setText("")

        self.worker.start.emit()

    @Slot()
    def on_pbStop_clicked(self):
        logthread('MainWindow.on_pbStop_clicked')
        self.widget.pbrProgress.setRange(0, 1)

        self.worker.stop.emit()

    @Slot(str)
    def qtextedit_addtext(self, text):
        logthread('MainWindow.qtextedit_addtext args-{}'.format(str(text)))
        self.teErrors.setText(str(text))

    @Slot()
    def endNow(self):
        logthread('MainWindow.endNow')
        self.worker.continueWork = False

    @Slot(int)
    def updateProgressBar(self, progress):
        logthread('MainWindow.updateProgressBar')
        self.widget.pbrProgress.setValue(progress)

    @Slot()
    def on_actionProject1_triggered(self):
        logthread('MainWindow.on_actionProject1_triggered')

        from projectsettings1 import SettingsProject1
        dialogSettingsProject1 = SettingsProject1()
        dialogSettingsProject1.exec_()

    @Slot()
    def on_actionProject2_triggered(self):
        logthread('MainWindow.on_actionProject2_triggered')

        from projectsettings2 import SettingsProject2
        dialogSettingsProject2 = SettingsProject2()
        dialogSettingsProject2.exec_()

    def closeEvent(self, event: QCloseEvent):
        logthread('MainWindow.closeEvent')
        self.worker.continueWork = False
        self.thread.quit()
        self.thread.wait()

    def threadStarted(self):
        logthread('MainWindow.threadStarted')

    def threadFinished(self):
        logthread('MainWindow.threadFinished')

worker.py

from PySide2.QtCore import QObject, Signal, Slot
from util import logthread


class Worker(QObject):

    start = Signal()
    stop = Signal()

    progress = Signal(int)

    qtextedit = Signal(str)

    def __init__(self):
        logthread('Worker.__init__')
        super().__init__()

        self.continueWork = True

        self.start.connect(self.startNow)

        self.process = None

    @Slot()
    def startNow(self):
        logthread('Worker.startNow')

        self.continueWork = True

        try:
            self.do_heavy_task()
        except Exception as e:
            print(str(e))

    def do_heavy_task(self):
        count = 0
        while self.continueWork is True:
            count += 1

threading.py

import threading


def logthread(caller):
    print('%-25s: %s, %s,' % (caller, threading.current_thread().name,
                              threading.current_thread().ident))
...