use std::time::{Duration, Instant};
pub struct CpuLimiter {
pub duration: Duration,
last_time: Instant,
}
impl CpuLimiter {
pub fn new(duration: Duration) -> Self {
Self {
duration,
last_time: Instant::now(),
}
}
pub fn might_sleep(&mut self) {
let last_loop_time = self.last_time.elapsed();
if let Some(diff) = self.duration.checked_sub(last_loop_time) {
if !diff.is_zero() {
std::thread::sleep(diff);
}
}
self.last_time = Instant::now();
}
pub fn might_sleep_get(&mut self) -> Duration {
let mut sleep_duration = Duration::ZERO;
let last_loop_time = self.last_time.elapsed();
if let Some(diff) = self.duration.checked_sub(last_loop_time) {
if !diff.is_zero() {
std::thread::sleep(diff);
sleep_duration = diff;
}
}
self.last_time = Instant::now();
sleep_duration
}
}