Мне нужно реализовать следующий интерфейс: - есть окно с меткой «running experience 1/X» и кнопка - Когда окно загружено, запускаются некоторые эксперименты , Эксперименты выполняются os.system
из subprocess.Popen
, они только что скомпилированные программы на С ++ - Эксперименты должны выполняться строго один за другим, а не одновременно (следовательно, я не могу использовать subprocess.Popen
) - Окно должно быть активным, пока эксперименты и пользователь может нажать кнопку - Когда кнопка нажата, эксперименты прекращаются (мы можем просто подождать, пока текущий эксперимент не закончится и не остановится), и окно закрывается - Когда все эксперименты закончены, окно должно закрыть себяPython: немодальное окно с подпроцессами
Сначала я попытался запустить эксперименты в threading.Thread
, но он все равно заблокировал окно. Поэтому я переключился на multiprocessing.Process
:
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()
Однако, это не работает вообще, по-видимому, потому, что объект Runner
должен быть маринованный быть переданы подпроцесса, но травление не удается. Я думал об избежании передачи родительского аргумента и использовании сигналов Qt, но, может быть, есть лучшее решение?