如何通过另一个方法终止Python类中方法内的while循环?
问题原因分析
你的代码核心问题是主线程被StartRecording里的while循环完全阻塞,导致后续的time.sleep(3)和device.StopRecording()根本没机会执行——主线程一直卡在while循环里,isRecording永远不会被改成False,录制自然停不下来。
解决方案:用子线程执行录制逻辑
必须把录制的while循环放到独立子线程中运行,让主线程能正常执行后续的停止操作。下面提供两种可靠实现方式:
方案1:基于线程+锁维护录制状态
import threading from threading import Lock class MyClass(): def __init__(self): self.m_lock = Lock() self.isRecording = False self.recording_thread = None def _recording_loop(self): # 这里放原while循环内的录制逻辑 while self.isRecording: print("正在录制...") # 加短sleep避免CPU空转 threading.sleep(0.1) def StartRecording(self): with self.m_lock: if not self.isRecording: self.isRecording = True # 启动子线程执行录制循环 self.recording_thread = threading.Thread(target=self._recording_loop) self.recording_thread.start() def StopRecording(self): with self.m_lock: if self.isRecording: self.isRecording = False # 等待录制线程完全结束(可选,按需添加) self.recording_thread.join()
方案2:用threading.Event(更推荐)
Event是Python线程库专门用于线程间通信的工具,比手动维护布尔变量更可靠、高效:
import threading class MyClass(): def __init__(self): # 用Event控制录制状态 self._recording_event = threading.Event() self.recording_thread = None def _recording_loop(self): # 循环直到Event被清除 while self._recording_event.is_set(): print("正在录制...") # 用wait替代sleep,既能控制间隔,又能立即响应停止信号 if not self._recording_event.wait(0.1): break def StartRecording(self): if not self._recording_event.is_set(): self._recording_event.set() self.recording_thread = threading.Thread(target=self._recording_loop) self.recording_thread.start() def StopRecording(self): if self._recording_event.is_set(): self._recording_event.clear() if self.recording_thread is not None: self.recording_thread.join()
调用代码无需修改
你的调用脚本保持原样即可:
import MyClassFile as mcf import time device = mcf.MyClass() device.StartRecording() time.sleep(3) device.StopRecording()
额外注意事项
- 避免CPU空转:循环内一定要加
sleep或Event.wait(),否则空循环会占满单个CPU核心。 - 线程安全:修改共享状态时用锁(方案1)或线程安全的
Event(方案2),避免多线程操作导致的状态异常。 - 线程回收:调用
join()确保录制线程完全停止后,主线程再继续后续操作,避免资源泄漏。
内容的提问来源于stack exchange,提问作者eljamba
相关产品推荐
相关产品推荐

