88 lines
2.1 KiB
Rust
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!("退出主线程!");
|
|
}
|