Учитывая, что таймер не всегда работает в течение времени жизни GlobalTime
, не всегда допустимое значение для guard
.Мы обычно моделируем эту идею с помощью Option
:
struct GlobalTime {
tick_count: Arc<Mutex<u64>>,
millis: Arc<Mutex<i64>>,
timer: timer::Timer,
guard: Option<timer::Guard>,
}
, которая также решает вашу проблему относительно начального значения, потому что оно Option::None
:
impl GlobalTime {
fn new() -> GlobalTime {
GlobalTime {
tick_count: Arc::new(Mutex::new(0)),
millis: Arc::new(Mutex::new(200)),
timer: timer::Timer::new(),
guard: None,
}
}
}
tick
метод становится:
fn tick(&mut self) {
let global_tick = self.tick_count.clone();
let guard = self.timer.schedule_repeating(
chrono::Duration::milliseconds(*self.millis.lock().unwrap()),
move || {
*global_tick.lock().unwrap() += 1;
println!("timer callback");
},
);
self.guard = Some(guard);
}
Чтобы остановить таймер, вы можете просто установить значение защиты на Option::None
:
fn stop(&mut self) {
self.guard = None;
}