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