pub enum MissedTickBehavior {
Burst,
Delay,
Skip,
}
Expand description
Defines the behavior of an Interval
when it misses a tick.
Generally, a tick is missed if too much time is spent without calling
Interval::tick()
.
Default Skip
.
Variants§
Burst
Ticks as fast as possible until caught up.
When this strategy is used, Interval
schedules ticks “normally” (the
same as it would have if the ticks hadn’t been delayed), which results
in it firing ticks as fast as possible until it is caught up in time to
where it should be. Unlike Delay
and Skip
, the ticks yielded
when Burst
is used (the Instant
s that tick
yields) aren’t different than they would have been if a tick had not
been missed. Like Skip
, and unlike Delay
, the ticks may be
shortened.
This looks something like this:
Expected ticks: | 1 | 2 | 3 | 4 | 5 | 6 |
Actual ticks: | work -----| delay | work | work | work -| work -----|
In code:
use spin_sleep_util::{interval, MissedTickBehavior};
use std::time::Duration;
let mut interval =
interval(Duration::from_millis(50)).with_missed_tick_behavior(MissedTickBehavior::Burst);
// First tick resolves immediately after creation
interval.tick();
task_that_takes_200_millis();
// The `Interval` has missed a tick
// Since we have exceeded our timeout, this will resolve immediately
interval.tick();
// Since we are more than 100ms after the start of `interval`, this will
// also resolve immediately.
interval.tick();
// Also resolves immediately, because it was supposed to resolve at
// 150ms after the start of `interval`
interval.tick();
// Resolves immediately
interval.tick();
// Since we have gotten to 200ms after the start of `interval`, this
// will resolve after 50ms
interval.tick();
Delay
Tick at multiples of period
from when tick
was called, rather than
from start
.
When this strategy is used and Interval
has missed a tick, instead
of scheduling ticks to fire at multiples of period
from start
(the
time when the first tick was fired), it schedules all future ticks to
happen at a regular period
from the point when tick
was called.
Unlike Burst
and Skip
, ticks are not shortened, and they aren’t
guaranteed to happen at a multiple of period
from start
any longer.
This looks something like this:
Expected ticks: | 1 | 2 | 3 | 4 | 5 | 6 |
Actual ticks: | work -----| delay | work -----| work -----| work -----|
In code:
use spin_sleep_util::{interval, MissedTickBehavior};
use std::time::Duration;
let mut interval =
interval(Duration::from_millis(50)).with_missed_tick_behavior(MissedTickBehavior::Delay);
task_that_takes_more_than_50_millis();
// The `Interval` has missed a tick
// Since we have exceeded our timeout, this will resolve immediately
interval.tick();
// But this one, rather than also resolving immediately, as might happen
// with the `Burst` or `Skip` behaviors, will not resolve until
// 50ms after the call to `tick` up above. That is, in `tick`, when we
// recognize that we missed a tick, we schedule the next tick to happen
// 50ms (or whatever the `period` is) from right then, not from when
// were *supposed* to tick
interval.tick();
Skip
Skips missed ticks and tick on the next multiple of period
from
start
.
When this strategy is used, Interval
schedules the next tick to fire
at the next-closest tick that is a multiple of period
away from
start
(the point where Interval
first ticked). Like Burst
, all
ticks remain multiples of period
away from start
, but unlike
Burst
, the ticks may not be one multiple of period
away from the
last tick. Like Delay
, the ticks are no longer the same as they
would have been if ticks had not been missed, but unlike Delay
, and
like Burst
, the ticks may be shortened to be less than one period
away from each other.
This looks something like this:
Expected ticks: | 1 | 2 | 3 | 4 | 5 | 6 |
Actual ticks: | work -----| delay | work ---| work -----| work -----|
In code:
use spin_sleep_util::{interval, MissedTickBehavior};
use std::time::Duration;
let mut interval = interval(Duration::from_millis(50));
task_that_takes_75_millis();
// The `Interval` has missed a tick
// Since we have exceeded our timeout, this will resolve immediately
interval.tick();
// This one will resolve after 25ms, 100ms after the start of
// `interval`, which is the closest multiple of `period` from the start
// of `interval` after the call to `tick` up above.
interval.tick();
Trait Implementations§
Source§impl Clone for MissedTickBehavior
impl Clone for MissedTickBehavior
Source§fn clone(&self) -> MissedTickBehavior
fn clone(&self) -> MissedTickBehavior
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more