xref: /DragonReach/src/time/timer/mod.rs (revision dfd3fd9812f3584f9392934d1254e24d17661b2d)
1 use std::time::{Duration, Instant};
2 
3 use crate::error::runtime_error::RuntimeError;
4 
5 /// 伪定时器,结合主循环来实现计时,在计时器触发时,会执行相应的cmd命令
6 /// 后续实现线程后,应使用线程实现
7 pub struct Timer {
8     // 在创建计时器时记录当前时间
9     instant: Instant,
10     // 计时器触发时执行的闭包
11     callback: Box<dyn FnMut() -> Result<(), RuntimeError> + Send + Sync + 'static>,
12     // 计时时长
13     duration: Duration,
14     // 此计时器的拥有者(Unit)
15     parent: usize,
16 }
17 
18 impl Timer {
19     /// ## 创建计时任务
20     pub fn new(
21         duration: Duration,
22         callback: Box<dyn FnMut() -> Result<(), RuntimeError> + Send + Sync + 'static>,
23         parent: usize,
24     ) -> Self {
25         Timer {
26             instant: Instant::now(),
27             callback: callback,
28             duration: duration,
29             parent: parent,
30         }
31     }
32 
33     /// ## 判断当前是否到时,若执行该函数时已到时,将会执行定时任务
34     ///
35     /// ### return 到时返回true,否则返回false
36     pub fn check(&mut self) -> bool {
37         //println!("{},{}",self.instant.elapsed().as_micros(),self.duration.as_micros());
38         if self.instant.elapsed().saturating_sub(self.duration) > Duration::ZERO {
39             // TODO: 未进行错误处理
40             if let Err(_e) = (self.callback)() {
41                 println!("task error");
42             }
43             return true;
44         }
45         return false;
46     }
47 
48     /// ## 获取此计时器的拥有者Unit
49     pub fn parent(&self) -> usize {
50         self.parent
51     }
52 }
53