2013-09-27 7 views
2

무거운 백그라운드 작업을 multiprocessing 프로세스로 오프로드하려고합니다. 난 그냥 별도의 프로세스가 내 GUI로 진행 상황을보고 할 수 있기를 원합니다.PySide 및 다중 처리로 GUI 동결

#cannot do the following 
... 
def startWorking(self): 
    self.worker_obj = WorkerClass() 
    #pass the progress bar to the process and the process updates the bar 
    self.p = Process(target=self.worker_obj.worker, args=(self.progress_bar,)) 
: 그 수 pickle하지 않기 때문에,

from PySide.QtGui import * 
from PySide.QtCore import * 
import sys 
from multiprocessing import Process, Pipe 
import time 

class WorkerClass: 
#This class has the job to run 
    def worker(self, pipe): 
     for i in range(101): 
      pipe.send(i) 
      time.sleep(.02) 

class WorkStarter(QThread): 
#this thread takes a widget and updates it using progress sent from 
#process via Pipe 
    def __init__(self, progressBar): 
     super().__init__() 
     self.progress_bar = progressBar 

    def run(self): 
     worker_obj = WorkerClass() 
     myend, worker_end = Pipe(False) 
     self.p = Process(target=worker_obj.worker, args=(worker_end,)) 
     self.p.start() 
     while True: 
      val = myend.recv() 
      self.progress_bar.setValue(val) 
      if val == 100: 
       break 

class WorkingWidget(QWidget): 
    def __init__(self, parent=None): 
     super().__init__(parent) 
     self.setWindowTitle('Blue collar widget') 
     layout = QHBoxLayout() 
     start_btn = QPushButton('Start working') 
     start_btn.clicked.connect(self.startWorking) 
     end_btn = QPushButton('End working') 
     end_btn.clicked.connect(self.endWorking) 
     layout.addWidget(start_btn) 
     layout.addWidget(end_btn) 
     self.progress_bar = QProgressBar() 
     layout.addWidget(self.progress_bar) 
     self.setLayout(layout) 

    def startWorking(self): 
     self.thread = WorkStarter(self.progress_bar) 
     self.thread.start() 

    def endWorking(self): 
     self.thread.terminate() 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    main = WorkingWidget() 
    main.show() 
    sys.exit(app.exec_()) 

나는 과정에 대한 인수로 어떤 QObject을 전달할 수 없습니다 : 여기 내 마지막 시도가있어, GUI는 버튼의 부부와 진행 표시 줄이 간단

문제는이 gui가 작동하고 다른 시간이 멈추는 경우입니다 (그래서 '멈춤'까지 여러 번 '시작'을 누르십시오 :)). 여기 Windows에서는 pythonw.exe가 작동을 멈췄습니다. Any 그 이유는 무엇인지 실마리가?. 나는 혼자서 그것을 이해할 수 없다. 감사합니다

+0

에 충분하다, 여기 내 게시물을 참조 // 유래. 질문/답변/15698251/다중 처리 -gui-schema-to-not-responding-blocking/19296108 # 19296108 –

+0

관심을 가져 주셔서 감사합니다. 그러나 질문에 대답하지 않습니다. 다른 시간에 충돌합니까? – MadeOfAir

답변

1

당신은 QThread의 "run"메소드 안에 객체를 만들지 말고 "run"에서 신호를 내고, "callerFunction"라고하는 함수를 구현하고이 함수에서 객체를 생성하고 마지막으로 방출되는 신호에서이 함수를 호출해야합니다 "실행"기능으로

  • 이미 생성 한 while 루프에서 신호를 내보낼 수 있습니다. HTTP :
  • 는 파이썬 프로세스를 생성하지 않는 this 솔루션에서보세요, QThread가 내가 작업 예제가 생각이 일
+0

죄송합니다. 귀하는 GUI가 왜 정지하는지 명확히하지 않았습니다. 하지만 기회가있을 때 제공 한 링크를 확인해 보겠습니다. – MadeOfAir

+0

죄송합니다, 당신이 지적한 예는 단지 바보입니다. 나는 PyQt를 설치하지 않았지만, 클래스 내에서 스레드를 실행하는 라인을 바깥쪽으로 이동 시키면 어떤 마법도 수행되지 않을 것이라고 생각합니다. – MadeOfAir

+1

늦어서 미안하지만 항상 내가 너에게 말한대로해라. 그리고 나에게는 항상 잘 돌아갔다. – qurban

관련 문제