0

我正在使用 PyQt4为 Lights Out Board ( Wiki ) 编写一个简单的 GUI。GUI 有一个“解决”按钮,它使用迭代深化深度优先搜索。这很耗时,我生成了一个新的 QThread 来解决这个难题,并在它完成时更新板,同时 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() ,因为它在文档中是不受欢迎的。

4

1 回答 1

1

使用terminate()代替quit并调用wait(). wait()将阻塞直到 QThread 完成。

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

于 2012-10-26T06:59:07.133 回答