2013-03-28 3 views
1

QThreads 및 신호/슬롯을 사용하여 GUI와 통신하는 프로그램이 있습니다. 아래에 표시된 간단한 형식입니다.QThread 신호/QProcesses 슬롯

그러나 멀티 코어 처리를 활용할 수 있도록 이것을 QProcess로 변경하고 싶습니다. 이 작업을 수행하는 간단한 방법이 있습니까?

단순히 QThreadQProcess으로 변경하면 프로세스에 대해 moveToThread() 기능이 없습니다. 나는 Pipes()multiprocessing 모듈에서 Queues()과 같은 멀티 코어 처리에 대한 여러 가지 접근법을 시도해 왔지만, 아무 것도 잘 수행 할 수 없다. 그래서 나는 Qtland에 이미 있기 때문에 QProcess을 사용하는 것이 더 쉬울 것이라고 생각했습니다.

다음은 QThreads 신호 및 슬롯에 대한 간단한 코드입니다. 프로세스가 자신의 메모리 공간에 살고 있기 때문에

from PyQt4 import QtCore, QtGui 
import multiprocessing as mp 
import numpy as np 
import sys 

class Spectra(QtCore.QObject): 

    update_signal = QtCore.pyqtSignal(str) 
    done_signal = QtCore.pyqtSignal() 

    def __init__(self, spectra_name, X, Y): 
     QtCore.QObject.__init__(self) 
     self.spectra_name = spectra_name 
     self.X = X 
     self.Y = Y 
     self.iteration = 0 

    @QtCore.pyqtSlot() 
    def complex_processing_on_spectra(self): 
     for i in range(0,99999): 
      self.iteration += 1 
      self.update_signal.emit(str(self.iteration)) 
     self.done_signal.emit() 

class Spectra_Tab(QtGui.QTabWidget): 
    start_comp = QtCore.pyqtSignal() 
    kill_thread = QtCore.pyqtSignal() 
    def __init__(self, parent, spectra): 
     self.parent = parent 
     self.spectra = spectra 
     QtGui.QTabWidget.__init__(self, parent) 

     self.treeWidget = QtGui.QTreeWidget(self) 
     self.properties = QtGui.QTreeWidgetItem(self.treeWidget, ["Properties"]) 
     self.step = QtGui.QTreeWidgetItem(self.properties, ["Iteration #"]) 

     thread = QtCore.QThread(parent=self) 
     self.worker = self.spectra 
     self.worker.moveToThread(thread) 
     self.worker.update_signal.connect(self.update_GUI) 
     self.worker.done_signal.connect(self.closeEvent) 
     self.start_comp.connect(self.worker.complex_processing_on_spectra) 
     self.kill_thread.connect(thread.quit) 
     thread.start() 

    @QtCore.pyqtSlot(str) 
    def update_GUI(self, iteration): 
     self.step.setText(0, iteration) 

    def start_computation(self): 
     self.start_comp.emit() 

    def closeEvent(self): 
     print 'done with processing' 
     self.kill_thread.emit() 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent = None): 
     QtGui.QMainWindow.__init__(self) 

     self.setTabShape(QtGui.QTabWidget.Rounded) 
     self.centralwidget = QtGui.QWidget(self) 
     self.top_level_layout = QtGui.QGridLayout(self.centralwidget) 

     self.tabWidget = QtGui.QTabWidget(self.centralwidget) 
     self.top_level_layout.addWidget(self.tabWidget, 1, 0, 25, 25) 

     process_button = QtGui.QPushButton("Process") 
     self.top_level_layout.addWidget(process_button, 0, 1) 
     QtCore.QObject.connect(process_button, QtCore.SIGNAL("clicked()"), self.process) 

     self.setCentralWidget(self.centralwidget) 
     self.centralwidget.setLayout(self.top_level_layout) 

     # Open several files in loop from button - simplifed to one here 
     X = np.arange(0.1200,.2) 
     Y = np.arange(0.1200,.2) 
     self.spectra = Spectra('name', X, Y) 
     self.spectra_tab = Spectra_Tab(self.tabWidget, self.spectra) 
     self.tabWidget.addTab(self.spectra_tab, 'name') 

    def process(self): 
     self.spectra_tab.start_computation() 
     return 

if __name__ == "__main__": 
    app = QtGui.QApplication([]) 
    win = MainWindow() 
    win.show() 
    sys.exit(app.exec_()) 

답변

2

프로세스에 대한 moveToThread() 없다, 그래서 MainWindow 또는 구성원 중 하나를 볼 수 없습니다. QProcess을 사용하여 시작하는 응용 프로그램은 독립 실행 형 응용 프로그램으로 실행할 수 있어야합니다.

QProcess으로 스펙트럼을 실행하려면 MainWindow 멤버 대신 Spectra를 별도의 실행 가능 모듈로 만들어야합니다.

편집 :

당신은 MainWindow에 적어도 의존하는 독립적 인 모듈을 정의 할 필요가 - 그것은 스펙트럼 처리 탭 전용 또는 스펙트럼의 과정이 될 수 있습니다. 생성시 또는 표준 입력을 통해 정보를 전달하고 표준 출력을 통해 프로세스에서 데이터를 검색 할 수 있습니다. 프로세스를 넣을 변호사를 선택할 때 핵심 아이디어는 프로세스와 MainWindow 간의 통신 및 종속성을 최소화하는 것입니다.

int main(int argc,char* argv[]);

당신이/표준 입력에 필요한 출력을 통해 MainWindow에 어떤 결과 cout을/표준 출력/표준 오류 경우, 시작에 인수를 전달 CIN 통해 MainWindow를에서 추가 입력을 얻을 수 있습니다 : 당신은 간단한 C 프로그램으로 프로세스의 생각 (QProcess에 대한 인터페이스가 있음).

+0

감사합니다. @ilya, 전 당신이 동일한 메모리 공간에 있지 않은 프로세스에 대해 무엇을 말하고 있는지 이해합니다. 그러나 주 윈도우가 파일을 열고 데이터를 검색하여 스펙트럼 객체를 만드는 경우, 윈도우는 스펙트럼 유형 객체를 집계해야합니까? 탭 오브젝트를 생성하고 X, Y 데이터를 자체 프로세스의 별도 Spectra 오브젝트로 전달하는 해결책이 있습니까? – chase

+1

귀하의 의견을 해결할 답변을 편집했습니다. –