Почему мой класс QThread резко тормозит приложение PyQT5? - PullRequest
0 голосов
/ 08 ноября 2019

У меня проблема с потоками. Я отображаю текущее использование процессора с помощью индикатора выполнения, и он, кажется, работает хорошо, но производительность всего окна ужасна. Не могу даже нажать на кнопку без замедленного поведения. Есть ли простое решение, чтобы исправить это?

Вот мой основной код

from PyQt5 import QtCore, QtGui,  QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal


import progressBarUI
import sys
import sysnfo


class MainWindow(QtWidgets.QMainWindow, progressBarUI.Ui_MainWindow):
    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.threadclass = ThreadClass()
        self.threadclass.start()
        self.threadclass.signal.connect(self.updateProgressBar)

    def updateProgressBar(self):
        current_percentage = sysnfo.getCpuPercentage()
        self.progressBar.setValue(current_percentage)


class ThreadClass(QThread):
    signal = pyqtSignal(int)

    def __init__(self, parent=None):
        super(ThreadClass, self).__init__(parent)

    def run(self):
        while True:
            current_percentage = sysnfo.getCpuPercentage()
            self.signal.emit(current_percentage)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainAppWin = MainWindow()
    mainAppWin.show()
    app.exec_()

Вот модуль sysnfo:

import psutil as ps

def getCpuPercentage():
    return ps.cpu_percent(interval=1)

И файл пользовательского интерфейса (преобразованный в. py файл):


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(787, 203)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QtCore.QRect(370, 20, 381, 111))
        self.progressBar.setProperty("value", 0)
        self.progressBar.setObjectName("progressBar")


        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(20, 50, 151, 41))
        self.pushButton.setObjectName("pushButton")

        MainWindow.setCentralWidget(self.centralwidget)

        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 787, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)

        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Click me"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 08 ноября 2019

Когда вы используете параметр «интервал», вы указываете, что он измеряет информацию за это время и вычисляет среднее значение, при котором выполнение этой функции занимает «интервальные» секунды, и правильнее всего выполнить его в другом потоке. , но вы делаете ошибку, выполняя его тоже в методе updateProgressBar, который живет в основном потоке, блокирующем его, вместо этого используйте информацию, которая посылает вам сигнал:

@QtCore.pyqtSlot(int)
def updateProgressBar(self, percentage):
    self.progressBar.setValue(percentage)
...