2

バス ルーティングの問題の大きなグラフを作成および変更するプログラムの GUI を実装しています。

シミュレーションを開始する必要がある再生ボタンが必要です (simulate() メソッドを実行する新しいスレッド simThread を作成します。これは、modifyGraph() メソッドを何度も呼び出す無限ループです)。

また、一時停止ボタンが必要です。これを押すと、simThread が待機しますが、modifyGraph() への現在の呼び出しが終了するまでは待機しません)。これは、modifyGraph() の間、グラフがプロットされるべきではない状態にあることが多いためです。もう一度 [再生] を押すと、simThread は理想的には元の場所から続行するはずです。

私はスレッド化全般、特に Python に比較的慣れていませんが、条件変数が適していると感じています。誰もこれについてどうすればよいか知っていますか?

4

1 に答える 1

1

simThread が次のようになっている場合:

class simThread(threading.Thread):
    def run(self):
        while True:
            modifyGraph()

次のように、一時停止を解除するイベントを導入できます。

class simThread(threading.Thread):
    def __init__(self):
        self.unpaused = threading.Event()
        self.unpaused.set()
        threading.Thread.__init__(self)

    def run(self):
        while True:
            modifyGraph()
            unpaused.wait()

この機能を次のように使用します。

thread = simThread()
thread.start()
thread.unpaused.clear()
[...]
thread.unpaused.set()

unpaused呼び出されたイベントが少し厄介だと思う場合は、pause最初に に設定したブール変数を追加することもできますFalse。スレッドで、そうであるかどうかを確認してTrueから、一時停止解除イベントを待ちます。だから、このようなもの:

class simThread(threading.Thread):
    def __init__(self):
        self.pause = False
        self.unpause = threading.Event()
        threading.Thread.__init__(self)

    def run(self):
        while True:
            modifyGraph()
            if self.pause:
                unpause.wait()

    def pause(self):
        self.unpause.clear()
        self.pause = True

    def unpause(self):
        self.pause = False
        self.unpause.set()

thread = simThread()
thread.start()
thread.pause()
thread.unpause()

別の while ループを実行するのではなく、イベントを使用する必要がある理由は、self.pauseCPU サイクルの浪費を避けるためです。

于 2012-06-16T10:57:14.557 に答える