2

我正在为一个程序实现一个 GUI,该程序为总线路由问题构建和修改一个大图。

我想要一个播放按钮,它应该开始模拟(创建一个执行模拟()方法的新线程 simThread,这几乎是一个无限循环,一遍又一遍地调用方法 modifyGraph())。

我还想要一个暂停按钮,当按下它时会导致 simThread 等待,但不是直到它完成当前对 modifyGraph()) 的调用。这是因为在 modifyGraph() 期间,图形通常处于不应绘制的状态。当我再次按 Play 时,理想情况下 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.pause原因是为了避免浪费 CPU 周期。

于 2012-06-16T10:57:14.557 回答