rs-study-future/src/bin/section1-3.rs
2024-08-13 18:48:04 +08:00

88 lines
2.1 KiB
Rust

use std::{
borrow::BorrowMut,
cell::RefCell,
rc::Rc,
time::{Duration, Instant},
};
type TaskStatus = Rc<RefCell<bool>>;
#[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<F, T>
where
F: FnMut() -> T,
{
task_poll_fn: F,
task_status: TaskStatus,
}
impl<F, T> Task<F, T>
where
F: FnMut() -> T,
{
pub fn new(mut task_init_fn: impl FnMut() -> (F, TaskStatus)) -> Task<F, T> {
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<F, T>(task_list: &mut Vec<Task<F, T>>)
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!("退出主线程!");
}