CE Lua 计时器、热键与资源释放

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()

若关闭后仍有输出,请检查是否还运行了其他窗口或之前无所有者的计时器。

进一步验证

创建持续对象前,先确定由谁停止它、何时停止以及对象归谁所有。带窗体所有者的计时器会随窗体生命周期管理;没有所有者的对象需要显式清理。为回调添加可见的计数输出可以识别意外重复:如果一秒出现两次输出,检查是否执行了两份脚本,而不是立刻缩短间隔或不断创建新计时器。窗口关闭后再次验证输出已经停止。

参考资料