gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:46:57 25 4
gpt4 key购买 nike

我正在使用一个名为timer的 crate ,并且尝试将计时器“guard”放入哈希图中以存储它,以便可以在结束之前将其删除或确保不创建重复项。
问题在于,当通过函数将其插入到哈希图中时,计时器不会触发,但是如果将函数的主体移至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 的文档中提到,如果删除了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));
}

关于multithreading - 为什么不能通过函数安排计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65550087/

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