2011-02-23 15 views
5

Estoy creando una aplicación GUI (wxPython). Necesito ejecutar otra aplicación (.exe) desde la aplicación GUI. El subproceso realizará alguna operación en una acción del usuario y devolverá una salida a la aplicación GUICómo ejecutar otro proceso en un bucle en un hilo diferente

Estoy ejecutando este subproceso en un bucle, de modo que constantemente el subproceso esté disponible para ejecutarse. Lo que estoy haciendo es iniciar un hilo (para que la GUI no se congele) y abrir el subproceso en un bucle. No estoy seguro si esta es la mejor manera.

self.thread = threading.Thread(target=self.run, args=()) 
self.thread.setDaemon(True) 
self.thread.start() 

def run(self): 
     while self.is_listening: 
      cmd = ['application.exe'] 
      proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
      proc.wait() 
      data = "" 
      while True: 
       txt = proc.stdout.readline() 
        data = txt[5:].strip() 
        txt += data 

Ahora lo que sucede es que, si la aplicación principal es apagado, el hilo sigue a la espera de una acción del usuario que nunca llegó. ¿Cómo puedo salir limpiamente? El proceso de la aplicación.exe todavía se puede ver en la lista de procesos, incluso después de que la aplicación GUI haya salido. Cualquier sugerencia para mejorar todo es bienvenida.

gracias

+2

¿Por qué no estás usando 'wx.Process' /' wx.Execute() '? –

Respuesta

2

1) Hacer 'proc' un atributo de instancia, por lo que puede llamar se termina() o matar() métodos antes de salir.

self.thread = threading.Thread(target=self.run, args=()) 
self.thread.setDaemon(True) 
self.thread.start() 

def run(self): 
    while self.is_listening: 
     cmd = ['application.exe'] 
     self.proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
     self.proc.wait() 
     data = "" 
     while True: 
      txt = self.proc.stdout.readline() 
      data = txt[5:].strip() 
      txt += data 

2) Usar una variable para contar el hilo para detener (Usted tendrá que utilizar poll() en un bucle, en lugar de usar wait()).

self.exit = False 
self.thread = threading.Thread(target=self.run, args=()) 
self.thread.setDaemon(True) 
self.thread.start() 

def run(self): 
    while self.is_listening: 
     cmd = ['application.exe'] 
     proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
     while proc.poll() is None or not self.exit: 
      pass 
     data = "" 
     while True: 
      if self.exit: 
       break 
      txt = proc.stdout.readline() 
      data = txt[5:].strip() 
      txt += data 

El 'atexit' module documentation puede ayudarle con llamar a las cosas en la salida.

Cuestiones relacionadas