You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在线程中多次启停同一个函数?

问题:实现测量线程的多次启停

在带GUI循环的程序中,需要在循环内启动单独线程执行make_measurement读取设备数据,支持用户多次启停该线程。原代码中因复用同一个Thread对象,线程结束后无法再次启动,导致无法实现多次启停。

核心原因

Python的Thread对象是一次性的:一旦线程执行完毕(或被终止),就不能再次调用start()方法,必须重新创建新的Thread实例。

解决方案

  1. 不再提前创建固定的线程对象,而是在需要启动时动态生成新的Thread实例
  2. 每次启动前重置Event对象,确保新线程不受上次停止信号的影响
  3. 用变量跟踪当前活跃的线程实例,判断是否需要启动新线程

修改后的代码

from threading import Thread, Event
from time import sleep

def make_measurement(n, x, event):
    i = n
    while i > 0 and not event.is_set():
        sleep(0.5)
        i -= 1
        x[0] = i

run = True
j = 0
x = [0]
current_thread = None
event = Event()

# GUI循环
while run:
    sleep(0.2)
    # 当没有活跃线程时,启动新线程
    if current_thread is None or not current_thread.is_alive():
        event.clear()  # 重置停止信号
        current_thread = Thread(target=make_measurement, args=(20, x, event))
        current_thread.start()
        print("测量线程已启动")
    
    j += 1
    print(f"GUI循环迭代: {j}, 当前数值: {x[0]}")
    
    # 模拟用户触发停止操作(实际中替换为按钮事件)
    if x[0] == 11:
        event.set()
        print("测量线程已停止")
    
    # 可添加退出GUI循环的条件,比如检测用户关闭窗口
    # if 退出条件:
    #     run = False
    #     event.set()  # 停止当前线程

代码说明

  • 每次启动线程前调用event.clear(),清除之前的停止标记,保证新线程能正常运行
  • current_thread变量跟踪当前线程实例,每次启动时创建新对象,避免复用已结束的线程
  • 将event作为参数传入make_measurement,避免使用全局变量(更符合编码规范)
  • 循环条件中直接判断event.is_set(),简化停止逻辑

内容的提问来源于stack exchange,提问作者Marcin Łęcki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:27:12