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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:22:19