2010-05-18 11 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的模块不能够跨越进程边界。您需要使用 来使用多处理模块提供的类或某些其他的进程间通信方法来在父进程 和子进程之间进行通信。

所以我使用线程模块固定我的问题。

相关问题