为什么我不能通过函数安排计时器?



我正在使用一个名为timer的板条箱,我正在尝试放置一个计时器"防护";到一个hashmap中存储它,这样我就可以在它结束之前删除它,或者确保我不会创建重复。

问题是,当通过函数插入到hashmap中时,计时器不会触发,但如果将函数体移动到main,则计时器可以正常工作。

extern crate chrono;
extern crate timer;
use std::collections::HashMap;
use std::thread;
use std::time::Duration;
fn insert_to_guard_map(guard_map: &mut HashMap<i32, timer::Guard>) {
let timer = timer::Timer::new();
let guard = timer.schedule_with_delay(chrono::Duration::seconds(2), || {
println!("Called after 2s.");
});
guard_map.insert(42, guard);
}
fn main() {
let mut guard_map = HashMap::new();
insert_to_guard_map(&mut guard_map);
thread::sleep(Duration::from_secs(4));
}

TimerGuard的文档提到,如果TimerGuard被丢弃,则计划的执行最终会被取消。

因此,在这种情况下,将timerguard都插入到HashMap中。

use timer::{Guard, Timer};
fn insert_to_guard_map(guard_map: &mut HashMap<i32, (Timer, Guard)>) {
let timer = Timer::new();
let guard = timer.schedule_with_delay(chrono::Duration::seconds(2), || {
println!("Called after 2s.");
});
guard_map.insert(42, (timer, guard));
}

或者(可能更好(,将Timer的引用传递给insert_to_guard_map()

use timer::{Guard, Timer};
fn insert_to_guard_map(guard_map: &mut HashMap<i32, Guard>, timer: &Timer) {
let guard = timer.schedule_with_delay(chrono::Duration::seconds(2), || {
println!("Called after 2s.");
});
guard_map.insert(42, guard);
}
fn main() {
let timer = Timer::new();
let mut guard_map = HashMap::new();
insert_to_guard_map(&mut guard_map, &timer);
thread::sleep(Duration::from_secs(4));
}

最新更新