Skip to main content
 首页 » 编程设计

python之完成特定任务后暂停线程的条件变量(在 Python 中)

2025年05月04日13xiaohuochai

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

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

我还想要一个暂停按钮,按下时会导致 simThread 等待,但不会等待它完成当前对 modifyGraph() 的调用。这是因为在 modifyGraph() 期间,图形通常处于不应绘制的状态。当我再次按下“播放”时,simThread 理想情况下应该继续它原来的位置。

我对一般线程尤其是 Python 还比较陌生,但我觉得条件变量是正确的选择。有人知道怎么做吗?

请您参考如下方法:

如果您的 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 的事件有点尴尬,您还可以有一个额外的 bool 变量 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 周期。