gpt4 book ai didi

reference - 在结构中保留对 timer::guard 的引用

转载 作者:行者123 更新时间:2023-11-29 08:29:11 25 4
gpt4 key购买 nike

我正在尝试实现一个跟踪全局滴答的结构。为了重构,我将 timer 移到了结构中,但现在我面临着 timer guard 丢失引用并因此删除计时器的问题。我的想法是将守卫添加为结构成员,但我不确定该怎么做。

use timer;
use chrono;
use futures::Future;
use std::{process, thread};
use std::sync::{Arc, Mutex};

struct GlobalTime {
tick_count: Arc<Mutex<u64>>,
millis: Arc<Mutex<i64>>,
timer: timer::Timer,
guard: timer::Guard,
}

impl GlobalTime {
fn new() -> GlobalTime {
GlobalTime {
tick_count: Arc::new(Mutex::new(0)),
millis: Arc::new(Mutex::new(200)),
timer: timer::Timer::new(),
guard: ???, // what do I do here to init the guard??
}
}

fn tick(&self) {
*self.guard = {
let global_tick = self.tick_count.clone();
self.timer.schedule_repeating(
chrono::Duration::milliseconds(*self.millis.lock().unwrap()),
move || {
*global_tick.lock().unwrap() += 1;
println!("timer callback");
},
);
}
}
}

最佳答案

鉴于计时器并不总是在 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;
}

关于reference - 在结构中保留对 timer::guard 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54322391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com