2014-10-17 2 views
0

wxPython GUI가 포함되어있어 초기화시 워치 독 옵저버 및 파이썬 프로세스를 시작하는 앱이 있습니다.wxPython 창을 닫을 때 파이썬 워치 독이 종료되지 않습니다.

class MonitorApp(wx.App): 
    def __init__(self): 
     wx.App.__init__(self, True, 'monitor_stderr.log', False, False) 

     self.q = Queue() 
     self.m = Queue() 
     self.e = Queue() 

     monitor_handler = DirectoryMonitorHandler(self.q) 
     self.folder_monitor = polling.PollingObserver() 
     self.folder_monitor.schedule(monitor_handler, source, recursive = True) 
     self.folder_monitor.start() 

     self.backlog_manager = BacklogManager(self.q, self.m, self.e) 
     self.backlog_manager.start() 

나는이 wx.TaskBarIcon 콜백 메소드를 통해 wxPython에 창을 닫는 오전 :

def onClickExit(self, event): 
    app.keepGoing = False 
    app.DestroyChildProcess() 
    self.RemoveIcon() 
    self.Destroy() 
    self.frame.Destroy() 

을 DestroyChildProcess은 여기서 BacklogManager는 멀티 프로세스 서브 클래스입니다

def DestroyChildProcess(self): 
    self.folder_monitor.stop() 
    self.folder_monitor.join() 
    self.backlog_manager.terminate() 

참고. 내가 가지고있는 문제는 wxPython GUI 창을 닫을 때 Windows 작업 관리자에서 두 개의 pythonw.exe 프로세스를 계속 볼 수 있다는 것입니다. 다음과 같은 세 가지 가능성이 있습니다.

  1. GUI 프로세스가 올바르게 종료되지 않습니다. (프로세스인지 확실하지 않음)
  2. 감시 관찰자를 올바르게 종료하지 않습니다.
  3. backlog_manager 프로세스를 올바르게 종료하지 않습니다.

"self.backlog_manager.terminate()"는 pythonw.exe 인스턴스가 하나만 실행되도록하고 올바르게 작동하는 것처럼 보입니다.

내가 모든 pythonw.exe 프로세스를 올바르게 종료하거나 종료 할 수있는 방법이 있습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집 - 추가 조사를 통해 내 파이썬 스크립트를 시작하기 위해 사용하고있는 .bat 스크립트의 문제 일 수 있습니다. 기본적으로 pythonw.exe 및 START/B를 사용하여 명령 줄 창을 숨길 수 있습니다.

cd %~dp0 
START /B .\Modules\statusWindow.pyw 

그것은 보인다 나는 다음으로 스크립트를 시작할 때 :

cd %~dp0 
.\Modules\statusWindow.py 

내가 명령 줄 창을 닫습니다

, 모든 Windows 작업 관리자의 프로세스 끝. 나는 이것이 pythonw.exe 또는 프로세스를 끝내는 방식의 문제 일 가능성이 있다고 생각합니다. 창에

답변

0

나는

이 제대로 종료 전화 (또는 대안 직접 변수를 설정) 할 때 종료를하게됩니다 불안정하게 기껏 내가 무엇을 할 것이라고하는 것은

class BacklogManager(multiprocessing.Process): 
    _should_exit = multiprocessing.Value("b",0) 
    def terminate(self): 
     self._should_exit.value = 1 
    def run(self): 
     #instead of while True 
     while not self._should_exit.value: 
      do_work() 

같은이 작품을 종료 알고

관련 문제