2011-02-23 9 views
5

मैं एक जीयूआई एप्लीकेशन (WxPython) बना रहा हूं। मुझे जीयूआई एप्लिकेशन से एक और (.exe) एप्लिकेशन चलाने की जरूरत है। उपप्रोसेसर उपयोगकर्ता कार्रवाई पर कुछ ऑपरेशन करेगा और जीयूआई एप्लीकेशनएक अलग थ्रेड पर एक लूप में दूसरी प्रक्रिया कैसे चलाएं

पर आउटपुट लौटाएगा, मैं इस सबप्रोसेस को लूप में चला रहा हूं, ताकि लगातार उपप्रोसेस निष्पादित करने के लिए उपलब्ध हो। मैं जो कर रहा हूं वह है, मैं एक थ्रेड शुरू करता हूं (इसलिए गुई फ्रीज नहीं होता है) और लूप में सबप्रोसेस पॉपन करता है। यकीन नहीं है कि यह सबसे अच्छा तरीका है।

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 ऐप से बाहर निकलने के बाद भी एप्लिकेशन.एक्सई प्रक्रिया प्रक्रिया सूची में देखी जा सकती है। पूरी चीज को सुधारने के लिए कोई सुझाव स्वागत है।

धन्यवाद

+2

आप 'wx.prrocess'/'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) को रोकने के लिए धागा बताने के लिए कुछ चर का प्रयोग करें बजाय प्रतीक्षा (का उपयोग कर के, एक पाश में (आप सर्वेक्षण (का उपयोग करने की आवश्यकता होगी)))।

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 

'atexit' module documentation बाहर निकलने पर चीज़ों को कॉल करने में आपकी सहायता कर सकता है।

संबंधित मुद्दे