다음과 같은 UI를 구현해야합니다 : - "실험 1/X 실행"이라는 레이블이있는 윈도우와 버튼 - 창이로드되면 일부 실험이 시작됩니다. . 실험은 os.system
이 subprocess.Popen
으로 실행됩니다. 그냥 미리 컴파일 된 C++ 프로그램입니다. - 실험은 엄격히 하나씩 동시에 실행해야합니다 (따라서 subprocess.Popen
을 사용할 수 없음). - 실험이 진행되는 동안 창을 활성화해야합니다. 실행 중이며 사용자가 버튼을 누를 수 있습니다. - 버튼을 누르면 실험이 중지되고 (현재 실험이 끝나고 중지 될 때까지 기다릴 수 있음) 창을 닫습니다. - 모든 실험이 끝나면 창이 닫히기 시작합니다.파이썬 : 서브 프로세스가있는 넌 모달 윈도우
처음에는 threading.Thread
에서 실험을 시도했지만 여전히 창을 차단했습니다. Runner
객체가 하위 프로세스에 전달 될 절인해야한다 분명히 있기 때문에,
class StoppableProcess(Process):
def __init__(self, name, alg, proj, parent):
Process.__init__(self)
self.stop = False
self.name = name
self.alg = alg
self.proj = proj
self.parent = parent
def stop(self):
self.stop = True
def stopped(self):
return self.stop
def run(self):
count = len([k for k in self.proj.values()])
i = 1
for p in self.proj.values():
self.parent.label.setText("Running experiment " + str(i) + "/" + str(count))
os.system("some command here")
i += 1
if self.stopped():
break
self.parent.hide()
class Runner(QDialog):
def __init__(self, parent):
QDialog.__init__(self, parent)
self.layout = QVBoxLayout()
self.label = QLabel("Running experiment 0/0")
self.setWindowTitle("Running experiments")
button = QPushButton("Break experiments")
self.layout.addWidget(self.label)
self.layout.addWidget(button)
self.setLayout(self.layout)
QObject.connect(button, SIGNAL("clicked()"), self.Break)
def Run(self, name, alg, proj):
self.thread = StoppableProcess(name, alg, proj, self)
self.thread.start()
self.show()
self.thread.join()
def Break(self):
self.thread.stop()
self.hide()
그러나이 전혀 작동하지 않지만 산세가 실패 : 그래서 multiprocessing.Process
로 전환. 나는 부모 인수를 피하고 대신 Qt 신호를 사용하는 것에 대해 생각하고 있었지만 더 나은 해결책이있을 수 있습니까?