2014-01-24 35 views
0

我的一些方法涉及到os.chdir。在多線程中使用時,chdir會相互影響。wxPython中的multiprocessing apply_async塊GUI

所以我嘗試multiprocess.Pool調用這些方法在不同的過程中,它的工作。直到我在GUI中調用這些方法。

在wxPython中使用multiprocessing.Pool時,使用apply_async調用的方法仍會凍結GUI,如何解決此問題?

class MyFrame(wx.Frame): 

    def __init__(self): 
     super(MyFrame, self).__init__(None, -1, 'My Frame', size=(500, 300)) 
     self.pool = multiprocessing.Pool(maxtasksperchild=1) 
     panel = wx.Panel(self, -1) 
     self.screen = wx.TextCtrl(panel, -1, '', size=(500, 200), style=wx.TE_MULTILINE | wx.TE_READONLY) 
     vbox = wx.BoxSizer(wx.VERTICAL) 
     vbox.Add(self.screen, flag=wx.EXPAND) 
     vbox.Add(wx.Button(panel, 1, label='Block'), flag=wx.BOTTOM) 
     vbox.Add(wx.Button(panel, 2, label='Non-Block'), flag=wx.BOTTOM) 
     panel.SetSizer(vbox) 

     self.Bind(wx.EVT_BUTTON, self.onBlock, id=1) 
     self.Bind(wx.EVT_BUTTON, self.onNonBlock, id=2) 

    def onNonBlock(self, event): 
     self.pool.apply_async(self.long_job(4)) 

    def onBlock(self, event): 
     self.long_job(4) 

    def callback(self, x): 
     self.screen.WriteText('callback %s\n' % x) 

    def long_job(self, x): 
     self.screen.WriteText('enter %s\n' % x) 
     for i in range(x): 
      self.screen.WriteText('running %s\n' % i) 
      os.chdir('dir_%s' % x) 
      time.sleep(1) 
     self.screen.WriteText('exit %s\n' % x) 
+0

你最近怎麼樣?下面我的回答有幫助嗎? – GreenAsJade

回答

0

您的GUI凍結,因爲您沒有給應用程序處理時間來重繪圖形元素。

要糾正這個問題,您需要提供wx這個機會。一種方法是在long_job中撥打wx.Yield()

def long_job(self, x): 
    self.screen.WriteText('enter %s\n' % x) 
    for i in range(x): 
     self.screen.WriteText('running %s\n' % i) 
     os.chdir('dir_%s' % x) 
     wx.Yield() ### Allow graphical processing before sleeping 
     time.sleep(1)  
    self.screen.WriteText('exit %s\n' % x) 
+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – StarsSky

+0

@StarsSky:現在好多了? – GreenAsJade