跳到主要内容

定时器模块

· 阅读时间约2分钟
Y_Less

本篇前瞻文章展示了 open.mp 中定时器模块的改进,在保持向后兼容的同时,引入了一个更灵活、高效的 API。

注意

以下内容已过时,不反映 open.mp 的当前状态。本文发布于此仅作归档用。

这是我们对 open.mp 中定时器模块所做改进的一次前瞻性展示:

native SetTimer(const func[], msInterval, bool:repeat) = SetTimerEx;
native SetTimerEx(const func[], msInterval, bool:repeat, const params[], GLOBAL_TAG_TYPES:...);
native KillTimer(timer) = Timer_Kill;

// 创建定时器
native Timer:Timer_Create(const func[], usDelay, usInterval, repeatCount, const params[] = "", GLOBAL_TAG_TYPES:...);

// 终止定时器
native bool:Timer_Kill(Timer:timer);

// 返回下一次调用前的剩余时间。
native Timer_GetTimeRemaining(Timer:timer);

// 获取剩余调用次数(0 表示无限)。
native Timer_GetCallsRemaining(Timer:timer);

// 获取 `repeatCount` 参数。
native Timer_GetTotalCalls(Timer:timer);

// 获取 `usInterval` 参数。
native Timer_GetInterval(Timer:timer);

// 将距离下次调用的剩余时间重置为 `usInterval`。
native bool:Timer_Restart(Timer:timer);

前两个函数仅用于向后兼容,其余的是改进后的 API:

native Timer:Timer_Create(const func[], usDelay, usInterval, repeatCount, const params[] = "", GLOBAL_TAG_TYPES:...);
  • func - 作用显而易见,即指定要调用的函数。
  • usDelay - 同样显而易见,表示首次调用前的延迟时间(以微秒计)。
  • usInterval - 指定第一次调用后,将 usDelay 重置为何值。例如,如果你希望每小时执行一次定时器,而现在是上午 8:47,调用方式应为 Timer_Create("OnTheHour", 780 SECONDS, 3600 SECONDS, 0);
  • repeatCount - 与旧函数仅支持"一次"或"永久"不同,此参数指定调用函数的次数。"一次"为 1500 表示调用 500 次后停止,(与旧 API 相反)0 表示"永久执行"。
  • GLOBAL_TAG_TYPES - 类似于 {Float, ...},但支持更多标签。