2012-10-26 18 views
0

我正在使用PyQt4为Lights Out Board(Wiki)编写一个简单的GUI。 GUI具有使用迭代深化深度优先搜索的“解决”按钮。这非常耗时,我生成了一个新的QThread来解决这个难题,并在GUI完成响应时更新电路板。这我能做到。如何在QPushButton按下时暂停执行QThread?

但是,我也有一个'停止'按钮,它应该停止搜索线程,如果它正在运行,并且我无法使用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

使用terminate()而不是quit并致电wait()wait()将阻塞,直到QThread完成。

你可以做的另一件事是在线程外设置一个退出条件,你将在线程内检查(可能是最好的解决方案)。另外,您可以将插槽连接到finished信号。

+0

谢谢,终止工作。尽管第二种解决方案看起来不是一个明智的选择,因为它需要我编辑经过良好测试的代码的另一部分,并且还会增加模块中的耦合。 – 0x777

+0

如果我的解决方案对您有帮助,您可以标记是一个正确的答案。 – lukad