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

Solar2D/Lua定时器执行异常 出现无限循环且回调不触发问题

问题原因

timer.performWithDelay是异步非阻塞接口,调用后只会把定时任务加入事件队列,不会阻塞当前代码等待回调执行。
你的代码里外层while循环判断条件依赖回调里修改的i变量,但主线程会持续占满CPU跑while循环,事件队列里的定时回调永远得不到调度机会,i的值永远停在初始的0,循环永远不会退出,还会在极短时间内创建海量定时器占满资源,最终只会不断打印"s",永远进不到回调逻辑打印"a"。

修复代码

不要用外层同步循环嵌套异步定时器,直接用单个定时器维护所有计数状态即可,修正后代码如下:

-- 配置项
k = 10          -- 单轮倒计时秒数
it = 3          -- 总重复轮次
sec = k         -- 当前剩余秒数
i = 0           -- 当前已完成轮次
text.text = sec
print("s")

-- 创建单个1秒间隔的定时器,无限重复触发
local countdownTimer = timer.performWithDelay(1000, function()
    print("a")
    sec = sec - 1
    text.text = sec

    if sec == 0 then
        i = i + 1
        -- 所有轮次跑完就终止定时器
        if i >= it then
            timer.cancel(countdownTimer)
            return
        end
        -- 重置秒数进入下一轮
        sec = k
        text.text = sec
    end
end, 0)
关键说明
  • 移除了会阻塞主线程的while循环,保证事件队列正常调度,定时回调能按1秒间隔正常触发
  • 仅创建1个定时器,避免无意义的资源浪费
  • 所有轮次执行完成后主动调用timer.cancel销毁定时器,避免后台空跑

内容的提问来源于stack exchange,提问作者Nicholas O'Neal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:45:29