2017-12-10 41 views
-1

나는 멀티 스레딩을 처음 접했습니다. 사용하는 비디오 파일은 정상적으로 작동하며 시작시 진행률 표시 줄에 진행률 막대가 표시됩니다. 예를 들어 현재 CPU 사용 값과 같이 진행률 막대 값을 계속 변경하려면 코드를 실행할 때 아래 코드가 계속 충돌합니다. 코드가 작동하지 않는 이유는 무엇입니까 ??PyQt5 - 멀티 스레딩 설정 (Qthread)에서 progresssbar를 업데이트하는 동안 gui 충돌을 방지하는 방법은 무엇입니까?

저는 문제가 방출되어 연결된다고 생각합니다. 그렇다면 무엇을 할 수 있습니까? 어떻게 수정해야합니까? 도움에 미리 감사드립니다.

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

내 대답하십시오 : python3.5 + pyqt5.9는

는 그와 같은 CPU 정보를 업데이트하기 위해 타이머를 사용 , 그리고 이것이 도움이된다면 올바른 것으로 표시하는 것을 잊지 말고, 어떻게해야할지 모르는 경우 다음 링크를 확인하십시오 : [둘러보기] – eyllanesc

+0

'네 코드가 맞을 것 같아 .' 그리고'run()'메소드에서'while 1 : getcpu_and_emit'을 수행합니다. 이것은 좋은 생각이 아닙니다. 'while-True-op는 cpu-costing'이기 때문에 다른 스레드에서도 수행합니다. '타이머를 사용하여 정보를 업데이트하는 것이 더 좋은 생각입니다. ' 내 대답을 보라. – Silencer

+0

두 답변이 모두 솔루션의 절반 인 것처럼 보이며 병합해야합니다. 맞습니까? 아니면 eyllanesc ..'self.setupUi (self)'안에 문제의 적절한 진행 표시 줄이 있다고 제안 하시겠습니까? – ZF007

답변

0

는 ENV :

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_()