第 22/36 课 · 约 32 分钟
DAS Timer、Wait 与时间边界
用短回调、显式启停和跨日处理构建周期观察。
调度与等待不同
前置知识:共享状态与模块契约。手册描述 Timer Event 每秒执行,Wait(milliseconds) 暂停脚本继续运行;它不是 Promise、券商确认,也不能证明另一动作完成。手册不建议用 while 加 Wait 模拟 Timer。回调应短,将“何时检查”与“观察到什么状态”分开。
先初始化,再启用回调
安装练习时先清空或停用 Timer Event,手动运行初始化,再放入下方回调。它只更新计数和时间,不每秒弹窗,也不提交外部动作。
初始化脚本
$feClock = NewUserObj();
$feClock.enabled = 1;
$feClock.interval = 5;
$feClock.lastSecond = GetSecond();
$feClock.samples = 0;
Timer Event 正文
if ($feClock.enabled == 0) {
return;
}
$feNow = GetSecond();
if ($feNow < $feClock.lastSecond) {
$feClock.lastSecond = $feNow;
return;
}
if (($feNow - $feClock.lastSecond) >= $feClock.interval) {
$feClock.lastSecond = $feNow;
$feClock.samples = $feClock.samples + 1;
}
解释时间规则
GetSecond 是午夜以来秒数,不是 Unix 时间。当时间向后跳,回调重设基准并跳过本轮;其他情况下,经过五秒才增计数,每次回调最多增加一次。延迟回调不会补执行所有错过的周期,这是“跳过遗漏采样”的规则,不是实时调度保证,也不代表交易所或券商时间。跨日与系统时钟变化要单独测试。
观察与停止
MsgBox($feClock.samples, $feClock.lastSecond);
$feClock.enabled = 0;
练习与参考解答
lastSecond=100、interval=5,回调到达时间为 102、105、117。参考结果:102 不增加,105 增加一次,117 增加一次,不补执行 110、115。若 lastSecond=86399、now=2,则基准改为 2,不增加。卸载时先在 DAS 停用回调,再清理 $feClock;enabled 无法保护根本不存在的对象。