use std::{ borrow::BorrowMut, cell::RefCell, rc::Rc, time::{Duration, Instant}, }; type TaskStatus = Rc>; #[allow(dead_code)] fn delay_task(delay_time: usize) -> (impl FnMut() -> (), TaskStatus) { // 记录当前时间 let start_time = Instant::now(); let status = Rc::new(RefCell::new(false)); let mut _status = status.clone(); return ( move || { if !(*_status.borrow()) && (Instant::now() - start_time > Duration::from_secs(delay_time as u64)) { println!("已经经过了至少: {:?}秒", delay_time); _status.borrow_mut().replace(true); } }, status.clone(), ); } const TIME_PIECE: usize = 500; pub struct Task where F: FnMut() -> T, { task_poll_fn: F, task_status: TaskStatus, } impl Task where F: FnMut() -> T, { pub fn new(mut task_init_fn: impl FnMut() -> (F, TaskStatus)) -> Task { let (task_poll_fn, task_status) = task_init_fn(); Task { task_poll_fn, task_status, } } pub fn run(&mut self) { if !(*self.task_status.borrow()) { (self.task_poll_fn)(); } } } fn event_loop(task_list: &mut Vec>) where F: FnMut() -> T, { loop{ let mut is_all_done = true; for task in task_list.iter_mut() { if !(*task.task_status.borrow()) { is_all_done = false; task.run(); break; } } if is_all_done { break; } std::thread::sleep(Duration::from_millis(TIME_PIECE as u64)); } println!("事件循环退出!"); } fn main() { let mut task_list = vec![]; let delay_seconds_time: usize = 5; task_list.push(Task::new(move || { return delay_task(delay_seconds_time); })); task_list.push(Task::new(move || { return delay_task(delay_seconds_time * 2); })); event_loop(&mut task_list); println!("退出主线程!"); }