如何在线程中多次启停同一个函数?
问题:实现测量线程的多次启停
在带GUI循环的程序中,需要在循环内启动单独线程执行make_measurement读取设备数据,支持用户多次启停该线程。原代码中因复用同一个Thread对象,线程结束后无法再次启动,导致无法实现多次启停。
核心原因
Python的Thread对象是一次性的:一旦线程执行完毕(或被终止),就不能再次调用start()方法,必须重新创建新的Thread实例。
解决方案
- 不再提前创建固定的线程对象,而是在需要启动时动态生成新的Thread实例
- 每次启动前重置
Event对象,确保新线程不受上次停止信号的影响 - 用变量跟踪当前活跃的线程实例,判断是否需要启动新线程
修改后的代码
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
相关产品推荐
相关产品推荐

