2017-12-10 3 views
-1

Ich bin neu in Multithreading. Die Videodatei, die ich benutze, funktioniert gut und der Fortschrittsbalken am Anfang zeigt einen Prozent in Fortschrittsbalken. Wenn ich den Fortschrittsbalkenwert kontinuierlich ändern möchte, zum Beispiel den aktuellen CPU-Nutzungswert, stürzt der unten stehende Code ab, wenn ich den Code ausführe. Warum funktioniert der Code nicht?PyQt5 - Wie vermeidet man das Abstürzen von GUI während der Aktualisierung der Fortschrittsbalken in einer Multi-Threading-Einstellung (Qthread)?

Ich denke, das Problem ist emittieren und verbinden. Wenn ja, was kann ich tun? Und wie korrigiere ich das? Vielen Dank im Voraus für die Hilfe.

import sys 
from PyQt5 import QtCore, QtGui, QtWidgets 
from PyQt5.QtCore import QObject, pyqtSignal 
import sysinfo 
from multi import Ui_Form 


class main(QtWidgets.QWidget ,Ui_Form): 
    cpu_value = pyqtSignal() 
    def __init__(self, parent = None): 
     super(main,self).__init__(parent) 
     self.setupUi(self) 
     self.threadclass = ThreadClass() 
     self.threadclass.start() 
     self.cpu_value.connect(self.updateProgressBar) 



    def updateProgressBar(self): 
     val = sysinfo.getCPU() 
     self.progressBar.setValue(val) 

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

    def run(self): 
     while 1: 
      val = sysinfo.getCPU() 
      self.cpu_value.emit(val) 

if __name__ == '__main__': 
    a = QtWidgets.QApplication(sys.argv) 
    app = main() 
    app.show() 
    a.exec_() 
+0

mit meiner Antwort Versuchen , und wenn dies hilft, vergessen Sie nicht, es als richtig zu markieren, wenn Sie nicht wissen, wie es geht, überprüfen Sie den folgenden Link: [Tour] – eyllanesc

+0

'Ich nehme an, dass dein Code richtig ist. ' Dann tun Sie 'while 1: getcpu_and_emit' in der 'run()' Methode, das ist keine gute Idee. Denn 'while-True-op ist cpu-costing', auch wenn du es in einem anderen Thread machst. 'Ich denke, verwenden Sie einen Timer, um einige Informationen zu aktualisieren, ist eine bessere Idee '. Siehe meine Antwort. – Silencer

+0

es sieht aus wie beide Antworten sind die Hälfte der Lösung hier und sollte zusammengeführt werden, oder? Oder eyllanesc .. schlagen Sie vor, 'self.setupUi (self)' hat den entsprechenden Fortschrittsbalken in Frage? – ZF007

Antwort

0

env: python3.5 + pyqt5.9

verwende ich einen Timer, um die CPU-Info, so zu aktualisieren:

enter image description here


#!/usr/bin/python3 
# 2017.12.10 13:20:11 CST 
# 显示 CPU 

import sys 
from PyQt5 import QtCore, QtWidgets 
import psutil 

class CPU(QtWidgets.QProgressBar): 
    def __init__(self, parent=None): 
     super().__init__(parent) 
     self.setWindowTitle("CPU Info") 
     self.timer = QtCore.QTimer(self) 
     self.timer.timeout.connect(lambda : self.setValue(psutil.cpu_percent())) 
     self.timer.start(1000) 

if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    win = CPU() 
    win.show() 
    app.exec_() 
Verwandte Themen