2009-04-07 2 views
0

Я пытаюсь подкласса wx.Process, так что у меня есть настраиваемая программа запуска, которая возвращает события в основной поток с данными, собранными из потока stdout. Это хороший способ сделать что-то?Каков наилучший способ распространения информации из моего 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 никогда не выполняется, хотя я уверен, что привязал ее к событию бездействия.

ответ

1

Цель состоит в том, чтобы не вызывать методы другого процесса, цель состоит в том, чтобы перенаправить стандартный вывод другого процесса обратно в родительский процесс через события «обновления», которые периодически запускаются по мере выполнения процесса.

Одним из решений является использование 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)) 

С помощью этого метода каждые 100 мс поток вывода считывается, упаковывается и отправляется как событие сборки.

0

От взгляда на документы wxProcess я не думаю, что это работает так: wxProcess создаст новый, отдельный процесс, выполняющийся как дочерний вас текущий процесс. Невозможно запустить методы, связанные с сообщением в таком процессе.

Возможно, вы можете подключить свое событие ожидания к функции или методу в вашей основной теме.

Или, возможно, класс wxThread - это то, что вы действительно хотите использовать.

 Смежные вопросы

  • Нет связанных вопросов^_^