CE Lua 计时器、热键与资源释放
计时器和热键能让 CE Lua 响应时间与键盘事件。本文解释持续运行对象的创建、停用和释放,避免反复执行产生重复回调。
创建可控计时器
createTimer(nil, false) 创建初始关闭、没有所有者的计时器,需自行释放。设置 Interval 为毫秒并赋值 OnTimer,准备完成后才设 Enabled = true。例如每秒打印一次提示:
local t = createTimer(nil, false)
t.Interval = 1000
t.OnTimer = function(sender) print("tick") end
t.Enabled = true
-- 停止时:
t.Enabled = false
t.destroy()
这段代码展示生命周期;若立即运行停止部分,计时器可能没有机会触发。实际使用要把停止放到按钮或关闭事件。
回调内先判断目标
回调执行时目标可能已经退出,先检查当前状态并重新解析需要的符号;解析失败则停止或显示提示。不要在高频计时器中运行耗时扫描,也不要在目标不明确时反复写入。间隔应与需要的更新速度相匹配,并在实践中观察界面是否仍然响应。
热键不是一次性变量
createHotkey(function, keys, ...) 返回 GenericHotkey;记录引用,并在不再需要时调用 destroy()。重复执行创建脚本而不销毁旧热键会产生多个回调。只有明确要长期保留时才存放引用;同一 Lua 状态内重新运行脚本前应先清理上一次实例。
排查与验收
建立一个只输出提示的定时器,等待两次回调后通过关闭动作停用,再观察输出是否停止。热键先绑定无副作用的打印动作,按一次确认一次输出,清理后再次按键确认无输出。若无反应,检查是否已启用、快捷键冲突、窗口焦点以及对象是否过早被销毁。
用窗口控制一个计时器
以下例子无需附加进程。点击“开始”后每秒输出一次,关闭窗口后输出停止;计时器以窗口为所有者,由窗口释放。重复点击不会新建计时器。
local form = createForm(false)
form.Caption = "计时器练习"
local button = createButton(form)
button.Caption = "开始"
local timer = createTimer(form, false)
timer.Interval = 1000
timer.OnTimer = function() print("tick") end
button.OnClick = function() timer.Enabled = true end
form.OnClose = function()
timer.Enabled = false
return caFree
end
form.show()
若关闭后仍有输出,请检查是否还运行了其他窗口或之前无所有者的计时器。
进一步验证
创建持续对象前,先确定由谁停止它、何时停止以及对象归谁所有。带窗体所有者的计时器会随窗体生命周期管理;没有所有者的对象需要显式清理。为回调添加可见的计数输出可以识别意外重复:如果一秒出现两次输出,检查是否执行了两份脚本,而不是立刻缩短间隔或不断创建新计时器。窗口关闭后再次验证输出已经停止。