QThreads 및 신호/슬롯을 사용하여 GUI와 통신하는 프로그램이 있습니다. 아래에 표시된 간단한 형식입니다.QThread 신호/QProcesses 슬롯
그러나 멀티 코어 처리를 활용할 수 있도록 이것을 QProcess로 변경하고 싶습니다. 이 작업을 수행하는 간단한 방법이 있습니까?
단순히 QThread
을 QProcess
으로 변경하면 프로세스에 대해 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_())
감사합니다. @ilya, 전 당신이 동일한 메모리 공간에 있지 않은 프로세스에 대해 무엇을 말하고 있는지 이해합니다. 그러나 주 윈도우가 파일을 열고 데이터를 검색하여 스펙트럼 객체를 만드는 경우, 윈도우는 스펙트럼 유형 객체를 집계해야합니까? 탭 오브젝트를 생성하고 X, Y 데이터를 자체 프로세스의 별도 Spectra 오브젝트로 전달하는 해결책이 있습니까? – chase
귀하의 의견을 해결할 답변을 편집했습니다. –