무거운 백그라운드 작업을 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 그 이유는 무엇인지 실마리가?. 나는 혼자서 그것을 이해할 수 없다. 감사합니다
에 충분하다, 여기 내 게시물을 참조 // 유래. 질문/답변/15698251/다중 처리 -gui-schema-to-not-responding-blocking/19296108 # 19296108 –
관심을 가져 주셔서 감사합니다. 그러나 질문에 대답하지 않습니다. 다른 시간에 충돌합니까? – MadeOfAir