如何用repeat-until实现通过spbRewind按钮启停重复动作
实现按钮触发的重复倒带动作(直到再次按下按钮)
你的问题核心是不能用阻塞式的repeat-until循环——一旦进入这个循环,UI线程会被完全卡死,根本无法捕获第二次按钮点击事件。正确的做法是用状态变量配合定时器实现非阻塞的重复执行:
步骤1:添加状态标记
定义一个类级或全局的布尔变量,用来标记当前是否处于倒带状态:
private IsRewinding: Boolean;
步骤2:处理按钮点击事件
在spbRewind的点击事件里切换倒带状态,同时初始化计时变量:
procedure TYourForm.spbRewindClick(Sender: TObject); begin IsRewinding := not IsRewinding; if IsRewinding then PrevCallTime := CurrTime; // 初始化计时,避免第一次触发延迟 end;
步骤3:修改定时器逻辑,去掉阻塞循环
原来的repeat-until会卡死线程,改成每次定时器触发时执行一次倒带动作,直到IsRewinding被关闭:
// 定时器回调/每帧更新逻辑里的代码 TimeForRewind := IsRewinding and (CurrTime - PrevCallTime > IdealFrameTimeMSRewind); if TimeForRewind then begin GotoSaveState(Game.CurrentIteration -4, 0); PrevCallTime := CurrTime; // 更新上次执行时间,保证10ms间隔 end;
为什么不能用原来的循环?
当你进入repeat-until后,代码会一直卡在循环里,操作系统无法处理新的按钮点击消息——因为UI线程被阻塞了。用状态变量+定时器的方式,每次只执行一次倒带动作,线程能及时响应按钮事件,切换状态停止倒带。
内容的提问来源于stack exchange,提问作者Willicious
相关产品推荐
相关产品推荐

