0

PyQt4 を使用して Lights Out Board ( Wiki ) の簡単な GUI を作成しています。GUI には、反復的深化深さ優先検索を使用する「解決」ボタンがあります。これには時間がかかるため、パズルを解くために新しい QThread を生成し、GUI の応答性を維持しながら、パズルが終了したときにボードを更新します。これは私ができることです。

しかし、現在実行中の検索スレッドを停止する「停止」ボタンもあり、exit() を使用して QThread を停止することはできません。3 つの関数のコードを次に示します。

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 が終了するまでブロックします。

あなたができるもう1つのことは、スレッド内でチェックするスレッド外で終了条件を設定することです(おそらく最良の解決策です)。finishedさらに、スロットを信号に接続できます。

于 2012-10-26T06:59:07.133 に答える