2012-10-26 2 views
0

나는 PyQt4를 사용하여 Lights Out Board (Wiki)를위한 간단한 GUI를 작성하고있다. GUI에는 반복 심화 깊이 검색을 사용하는 'Solve'버튼이 있습니다. 이것은 시간이 오래 걸리며, 퍼즐을 풀고 GUI가 반응하는 동안 완료 될 때 게시판을 업데이트하기 위해 새로운 QThread를 생성합니다. 이 일은 할 수 있습니다.QPushButton을 눌렀을 때 QThread의 실행을 일시 중단하는 방법은 무엇입니까?

그러나 'Stop'버튼이있어 검색 스레드가 현재 실행 중이고 exit()를 사용하여 QThread를 중지 할 수없는 경우 중지해야합니다. 다음은 세 가지 기능에 대한 코드입니다. 나는 '정지'버튼을 클릭하면

class LightsOut(QWidget): 
    def __init__(self, parent=None): 
     # Whole other initialization stuff 
     self.pbStart.clicked.connect(self.puzzleSolver) # The 'Start' Button 
     self.pbStop.clicked.connect(self.searchStop) # The 'Stop' Button 

    def searchStop(self): 
     if self.searchThread.isRunning(): 
      self.searchThread.exit() # This isn't working 
      self.tbLogWindow.append('Stopped the search !') # This is being printed 
     else: 
      self.tbLogWindow.append('Search is not running') 

    def searchFinish(self): 
     self.loBoard.setBoard() # Redraw the lights out board with solution 

    def puzzleSolver(self): 
     maxDepth = self.sbMaxDepth.value() # Get the depth from Spin Box 
     self.searchThread = SearchThread(self.loBoard, self.tbLogWindow, maxDepth) 
     self.searchThread.finished.connect(self.searchFinish) 
     self.tbLogWindow.append('Search started') 
     self.searchThread.start() 

는 로그인 창 (QTextBrowser), 내가 볼 수에서 메시지 '검색을 중지',하지만 내 CPU는 여전히 100 % 실행하고 검색은 완료 할 때 솔루션이 표시됩니다 (searchFinish가 호출 됨). 분명히, 나는 아주 간단한 것을 잃어 버렸고, 문서에서 눈살을 찌푸린 것처럼 terminate()를 사용하지 않았다.

답변

1

quit 대신 terminate()을 사용하고 wait()으로 전화하십시오. wait()은 QThread가 끝날 때까지 차단됩니다.

할 수있는 또 다른 일은 스레드 외부에서 종료 조건을 설정하는 것입니다 (아마도 가장 좋은 해결책입니다). 또한 슬롯을 finished 신호에 연결할 수 있습니다.

+0

감사합니다. 종료하십시오. 두 번째 해결 방법은 잘 테스트 된 코드의 다른 부분을 편집해야하기 때문에 현명한 선택이 아닌 것처럼 보이며 모듈의 커플 링도 증가시킵니다. – 0x777

+0

내 솔루션이 도움이 되었다면, 정답을 표시 할 수 있습니다. – lukad