2013-06-24 32 views
3

我尝试使用多处理来创建一个非阻塞的GUI。 Multiprocessing.Pool.appy_async()函数允许添加回调函数,这使得在完成一项耗时的操作后,可以轻松更新主GUI。但是,当点击button1时,下面的代码仍然被阻塞。我怎样才能修改这个,以便在button1回调执行时,button2仍然有回应。我正在运行python 2.7和多处理0.70a1。如何使用PySide正确使用multiprocessing.Pool来创建一个非阻塞的GUI

from PySide.QtCore import * 
from PySide.QtGui import * 
import multiprocessing 
import time 
import sys 


def f(x): 
    '''This is a time-intensive function 
    ''' 
    y = x*x 
    time.sleep(2) 
    return y 


class MainWindow(QMainWindow): #You can only add menus to QMainWindows 

    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.pool = multiprocessing.Pool(processes=4) 

     button1 = QPushButton('Connect', self) 
     button1.clicked.connect(self.apply_connection) 
     button2 = QPushButton('Test', self) 
     button2.clicked.connect(self.apply_test) 
     self.text = QTextEdit() 

     vbox1 = QVBoxLayout() 
     vbox1.addWidget(button1) 
     vbox1.addWidget(button2) 
     vbox1.addWidget(self.text) 
     myframe = QFrame() 
     myframe.setLayout(vbox1) 

     self.setCentralWidget(myframe) 
     self.show() #display and activate focus 
     self.raise_() 


    def apply_connection(self): 
     result = self.pool.apply_async(f, [10], callback=self.update_gui) 
     result.get(3) 


    def update_gui(self, result): 
     self.text.append('Applied connection. Result = %d\n' % result) 


    def apply_test(self): 
     self.text.append('Testing\n') 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    gui = MainWindow() 
    app.exec_() 

回答

3

result.get(3)阻塞3秒等待结果。不要致电get,回调将处理结果。