我正在使用PyQt4为Lights Out Board(Wiki)编写一个简单的GUI。 GUI有一个'Solve'按钮,它使用Iterative Deepening Depth First Search。这很耗时,我会产生一个新的QThread来解决难题,并在GUI完成时更新电路板,同时GUI保持响应。我能做到这一点。
但是,我还有一个“停止”按钮,如果当前正在运行,它应该停止搜索线程,并且我无法使用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(),因为它在文档中不赞成。
答案 0 :(得分:1)
使用terminate()
代替quit
并致电wait()
。 wait()
将阻止,直到QThread完成。
您可以做的另一件事是在线程外部设置一个退出条件,您将在线程内检查(可能是最佳解决方案)。此外,您可以将插槽连接到finished
信号。