代码之家  ›  专栏  ›  技术社区  ›  Ryan

将信息从wx.Process传播回主线程的最佳方式是什么?

  •  0
  • Ryan  · 技术社区  · 17 年前

    我正在尝试子类化 wx.Process

    class BuildProcess(wx.Process):
        def __init__(self, cmd, notify=None):
           wx.Process.__init__(self, notify)
           print "Constructing a build process"
           self.Bind(wx.EVT_IDLE, self.on_idle)
           self.Redirect()
           self.cmd = cmd
           self.pid = None
    
       def start(self):
           print "Starting the process"
           self.pid = wx.Execute(self.cmd, wx.EXEC_ASYNC, self)
           print "Started."
    
       def on_idle(self, evt):
           print "doing the idle thing..."
           stream = self.GetInputStream()
           if stream.CanRead():
              text = stream.read()
              wx.PostEvent(self, BuildEvent(EVT_BUILD_UPDATE, self, data=text))
              print text
    
       def OnTerminate(self, *args, **kwargs):
           wx.Process.OnTerminate(self, *args, **kwargs)
           print "Terminating"
    

    BuildEvent 下面是的一个自定义子类 wx.PyEvent . 进程正在正确启动、运行和终止,但我的 on_idle

    2 回复  |  直到 17 年前
        1
  •  1
  •   Ryan    17 年前

    一种解决方案是使用wx.Timer定期轮询进程的输出流,这样我们就不必依赖EVT_IDLE来为我们完成工作(我很难启动EVT_IDLE)

    class BuildProcess(wx.Process):
    
        def __init__(self, cmd, notify=None):
            wx.Process.__init__(self, notify)
            self.Redirect()
            self.cmd = cmd
            self.pid = None
            self.timer = wx.Timer(self)
            self.Bind(wx.EVT_TIMER, self.on_timer)
    
        def start(self):
            wx.PostEvent(self, BuildEvent(EVT_BUILD_STARTED, self))
            self.pid = wx.Execute(self.cmd, wx.EXEC_ASYNC, self)
            self.timer.Start(100)
    
        def on_timer(self, evt):
            stream = self.GetInputStream()
            if stream.CanRead():
                text = stream.read()
                wx.PostEvent(self, BuildEvent(EVT_BUILD_UPDATE, self, data=text))
    
    
        def OnTerminate(self, *args, **kwargs):
            print "terminating..."
            stream = self.GetInputStream()
            if stream.CanRead():
                text = stream.read()
                wx.PostEvent(self, BuildEvent(EVT_BUILD_UPDATE, self, data=text))
            if self.timer:
                self.timer.Stop()
            wx.PostEvent(self, BuildEvent(EVT_BUILD_FINISHED, self))
    

    通过这种方法,输出流每100ms被读取、打包并作为构建事件发送。

        2
  •  0
  •   Ber    17 年前

    也许您可以将空闲事件连接到主线程中的函数或方法。

    或者,wxThread类可能是您真正想要使用的。