如何在Rust中实现按下F1后启动1到50000毫秒的计时任务
实现方案
第一步:补全Cargo.toml依赖
你当前的依赖少了代码里用到的anyhow和smol,补充后如下:
[dependencies] hookmap = "0.4.7" delay_timer = "0.10.1" anyhow = "1.0" smol = "1.3"
第二步:完整实现代码
use hookmap::*; use delay_timer::prelude::*; use anyhow::Result; use std::time::Duration; fn main() -> Result<()> { // 初始化全局定时任务调度器 let delay_timer = DelayTimerBuilder::default().build(); let hotkey = Hotkey::new(); hotkey!(hotkey => { // 监听F1按下事件 on_press(F1) { println!("F1按下,开始计时"); // 插入2000ms后执行的任务1 let task1 = TaskBuilder::default() .set_frequency_once_by_duration(Duration::from_millis(2000)) .spawn_async_routine(|| async move { // 这里写你的操作1逻辑 println!("触发操作1:当前计时2000ms"); })?; delay_timer.add_task(task1)?; // 插入39999ms后执行的任务2 let task2 = TaskBuilder::default() .set_frequency_once_by_duration(Duration::from_millis(39999)) .spawn_async_routine(|| async move { // 这里写你的操作2逻辑 println!("触发操作2:当前计时39999ms"); })?; delay_timer.add_task(task2)?; // 插入50000ms计时结束的收尾任务 let stop_task = TaskBuilder::default() .set_frequency_once_by_duration(Duration::from_millis(50000)) .spawn_async_routine(|| async move { println!("计时结束,累计50000ms"); })?; delay_timer.add_task(stop_task)?; } }); // 启动热键监听 hotkey.handle_input(); // 程序退出前停止调度器释放资源 delay_timer.stop_delay_timer()?; Ok(()) }
核心逻辑说明
- 不需要手动逐毫秒计数,直接给每个需要触发操作的时间点注册一次性定时任务即可,完全没有空转的性能损耗
- 用
set_frequency_once_by_duration可以精准指定任意毫秒数的触发时间,适配你各种自定义时间点的需求 - 定时任务是异步执行的,不会阻塞热键的正常监听,按下F1后你还可以继续响应其他热键操作
内容的提问来源于stack exchange,提问作者zwl1619
相关产品推荐
相关产品推荐

