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
相关产品推荐
相关产品推荐

