15 个不稳定版本 (3 个重大更改)
0.4.4 | 2024年2月18日 |
---|---|
0.4.2 | 2023年12月7日 |
0.4.0 | 2023年11月29日 |
0.1.1 | 2023年5月24日 |
#2 in #occurs
每月下载量 121
48KB
530 行
Event Sync
EventSync 是一个 crate,可以用来在固定时间间隔同步事件。
比如说,你希望一个事件每10毫秒发生一次,但设置这个事件需要几毫秒。你最终可能需要等待10毫秒加上设置事件所需的时间。
这就是 EventSync 发挥作用的地方。你可以创建一个 10ms 的 EventSync,设置你的事件,然后等待下一个滴答声。只要设置事件所需的时间小于 10ms,等待下一个滴答声将确保自上次事件以来恰好过去了 10ms。这看起来可能像这样
use event_sync::*;
let tickrate = 10; // 10ms between every tick.
let event_sync = EventSync::new(tickrate);
// multi-ms long task
event_sync.wait_for_tick();
// repeat the task
入门指南
为了使用 event_sync,你首先使用 EventSync::new()
创建一个 EventSync
实例。然后传入 EventSync 期望的滴答频率,以便知道滴答的持续时间。(有关创建 EventSync 的更多方法,请参阅示例)
滴答频率将是一个以毫秒表示的整数,不能低于 1。如果你传入 0,则将设置为 1 毫秒。
use event_sync::*;
let tickrate = 10; // 10ms between every tick
// Create an event synchronizer with a 10ms tickrate.
let event_sync = EventSync::new(tickrate);
有了这个,你可以调用诸如 wait_for_x_ticks
等方法。这将等待传入的滴答次数。
这看起来可能像这样
use event_sync::*;
let tickrate = 10;
let event_sync = EventSync::new(tickrate);
// multi-ms long task.
// wait for the next 2 ticks
event_sync.wait_for_x_ticks(2);
// repeat the task
这将使得相关任务每20ms运行一次。
什么是 Tick
?
可以将 Tick
视为从 EventSync 创建开始的时间上的想象中的标记,以 Tickrate
的持续时间为间隔。
当你等待 1 滴答时,EventSync 将休眠其当前线程,直到下一个滴答。如果你等待多个滴答,EventSync 将休眠直到下一个滴答,再加上等待的剩余滴答的时间。
另一种描述方式。假设我们有 10ms 的滴答频率,并且自上次滴答以来已经过去了 5ms。如果你等待 1 滴答,EventSync 将休眠 5ms,这是到下一个滴答标记的持续时间。
权限
EventSync 可以存在于两种状态,即 Mutable
和 Immutable
。这些状态表示可以在 EventSync
实例上调用哪些方法。
这些存在的原因是因为EventSync的关联性。必须涉及到某种层次结构,这样就不是任何人都可以改变世界。
如果您有一个包含EventSync的主结构,这将包含可变副本
use event_sync::*;
struct MasterTimeKeeper {
synchronizer: EventSync<Mutable>,
}
如果您想将此传递给任何其他需要同步的线程,您会想传递这个主同步器的不可变副本
use event_sync::*;
struct MasterTimeKeeper {
synchronizer: EventSync<Mutable>,
}
let tickrate = 10;
let who = MasterTimeKeeper { synchronizer: EventSync::new(tickrate) };
let connected_who: EventSync<Immutable> = who.synchronizer.clone_immutable();
// Pass the connected EventSync anywhere it's needed.
依赖项
~0.4-1MB
~24K SLoC