2011-02-23 11 views
5

私はGUIアプリケーション(wxPython)を作成しています。 GUIアプリケーションから別の(.exe)アプリケーションを実行する必要があります。サブプロセスはユーザーアクションに対して何らかの操作を実行し、GUIアプリケーションに出力を返します別のスレッド上のループで別のプロセスを実行する方法

このサブプロセスをループして実行していますので、常にサブプロセスを実行することができます。私がやっていることは、スレッドを開始し(guiはフリーズしない)、サブプロセスをループに入れて をポップすることです。これが最善の方法であるかどうかはわかりません。

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 

メインアプリケーションがシャットダウンされても、スレッドは決して来なかったユーザーアクションを待っています。どうすればきれいに終了できますか? GUIアプリが終了した後でも、application.exeプロセスはプロセスリストに表示されます。すべてを改善するための提案は大歓迎です。

おかげ

+2

なぜ 'wx.Process' /' wx.Execute() 'を使用していませんか? –

答えて

2

1)あなたはそれが終了する前に()メソッドを(終了)または殺すだ呼び出すことができますので、「PROC」インスタンスの属性を確認します。

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)は、代わりに待ち時間を())を使用しての、ループ内で(あなたが(ポーリングを使用する必要があります)を停止するスレッドを伝えるために、いくつかの変数を使用してください。

'atexit' module documentationは、退出時に電話をかけるのに役立ちます。

関連する問題