1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
pub mod impl_timer {
use std::sync::{Arc, Mutex};
/// start_time:Instant,step_time:Duration,stop_time:Duration,func:Box<dyn Fn()>
/// ```rust
/// use doe::run_timer;
/// fn run(){
/// println!("running ");
///}
/// run_timer(std::time::Instant::now(),std::time::Duration::from_secs(1),std::time::Duration::from_secs(5),Box::new(run));
///
/// ```
pub fn run_timer(
start_time: std::time::Instant,
step_time: std::time::Duration,
stop_time: std::time::Duration,
func: Box<dyn Fn()>,
) {
let mut elapsed_time = std::time::Duration::new(0, 0);
while elapsed_time < stop_time {
func();
std::thread::sleep(step_time);
elapsed_time = start_time.elapsed();
}
}
/// run timer by shared state
/// ```rust
/// use std::sync::{Arc, Mutex};
/// use doe::*;
/// let run_state = Arc::new(Mutex::new(true));
/// let t1 = std::thread::spawn({
/// let run_state = Arc::clone(&run_state);
/// move || {
/// std::thread::sleep(std::time::Duration::from_secs(5));
/// *run_state.lock().unwrap() = false;
/// }
/// });
///
/// let t2 = std::thread::spawn({
/// let run_state = Arc::clone(&run_state);
/// move || {
/// run_timer_by_state(
/// std::time::Duration::from_secs(1),
/// run_state,
/// Box::new(|| {
/// // Function body goes here
/// println!("Running...");
/// }),
/// );
/// }
/// });
///
/// // Wait for the threads to finish
/// t1.join().expect("Thread panicked");
/// t2.join().expect("Thread panicked");
///
/// ```
pub fn run_timer_by_state(
step_time: std::time::Duration,
run_state: Arc<Mutex<bool>>,
func: Box<dyn Fn()>,
) {
loop {
if *run_state.lock().unwrap() {
std::thread::sleep(step_time);
func();
} else {
break;
}
}
}
use std::sync::mpsc;
use std::thread;
use std::time::Duration;
/// run timer by send stop_massge by channel
///```rust
///use std::sync::mpsc;
///use std::thread;
///use std::time::Duration;
///use doe::*;
/// let (sender, receiver) = mpsc::channel::<bool>();
/// let t1 = thread::spawn(move || {
/// thread::sleep(Duration::from_secs(5));
/// sender.send(true).unwrap();
/// });
/// let t2 = thread::spawn(move || {
/// run_timer_by_channel(Duration::from_secs(1), receiver, Box::new(|| {
/// println!("running..");
/// }));
/// });
/// t1.join().expect("Thread panicked");
/// t2.join().expect("Thread panicked");
/// ```
pub fn run_timer_by_channel(
step_time: Duration,
stop_message: mpsc::Receiver<bool>,
func: Box<dyn Fn() + Send>,
) {
loop {
match stop_message.try_recv() {
Ok(true) => break,
_ => {
thread::sleep(step_time);
func();
}
}
}
}
}