2010-05-18 12 views
2

試圖從wxpython GUI運行耗時的任務。基本的想法是從GUI開始長時間的任務(按下一個按鈕),然後在對話框上的靜態文本應該從中更新。wxpython GUI和多處理 - 如何從長時間運行的進程發回數據

首先我嘗試了一些線程(http://wiki.wxpython.org/LongRunningTasks和許多其他資源),並且我想使用Publisher.class顯示消息。它沒有那麼好,在一條或兩條消息之後,GUI似乎被凍結了。

現在我想通過多處理實現這一點。我有這個方法我「GUI」類中:

 def do_update(self, e): 
      self.txt_updatemsg.SetLabel("Don't stop this \n") 
      ... 

      pub = Publisher() # i tried also calling directly from dbob object 
      # Publisher() is a singleton so this must be useless? 
      pub.subscribe(self.__update_txt_message, ('updatedlg', 'message')) 

      dbob = dbutils.DBUtils() # DBUtils is the class with 'long time' tasks 
      dbob.publisher = pub 

      p = Process(target=self.do_update_process, args=(dbob,)) 
      p.start() 
      while p.is_alive: 
       wx.Yield 

     def do_update_process(self, dbob): 
      dbob.do_update() 

__update_txt_message是一個簡單的功能,什麼套在對話框中的靜態文本。

問題是:我怎樣才能從這個過程發回一些短信(只是簡單的文本,這就是我需要的) 謝謝你們!

+0

後一些更多的工作,我最終在__update_txt_message方法(連接到Publisher類)的正確的信息。如果我把打印message.data它的作品,我可以在控制檯中看到它。但它不會更新靜態文本。所以現在的問題是:我如何強制更新?仍在挖... – wxpydon 2010-05-18 14:48:05

+0

你爲什麼放棄使用線程?通常,最好的解決方案是爲長時間運行的進程使用線程,並使用隊列在主線程和長時間運行的進程線程之間進行通信。 – 2010-05-19 03:19:31

+0

嗯,我不認爲現在的問題是使用線程或進程。我能夠在__update_txt_message中獲取所需的消息,但從那裏我無法更改靜態標籤,這看起來很奇怪。我可以將消息打印到控制檯,我可以使用SetLabel,然後使用GetLabel查看,確定消息存在,但不顯示對話框! – wxpydon 2010-05-19 05:54:56

回答

0

wx.CallAfter(功能)

+0

這應該放在哪裏? dbob對象的do_update()方法裏面?那麼函數arg呢? – wxpydon 2010-05-18 13:34:31

+2

就我所見,CallAfter將幫助我在處理工作後運行一個函數,但我想要的是在此工作期間獲取一些文本消息。 – wxpydon 2010-05-18 14:49:40

3

羅賓·鄧恩親切回答了我在wxPython郵件列表

PubSub的模塊不能夠跨越進程邊界。您需要使用 來使用多處理模塊提供的類或某些其他的進程間通信方法來在父進程 和子進程之間進行通信。

所以我使用線程模塊固定我的問題。

相關問題