我正在使用一个名为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));
}
Timer
和Guard
的文档提到,如果Timer
或Guard
被丢弃,则计划的执行最终会被取消。
因此,在这种情况下,将timer
和guard
都插入到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));
}