#timer #timeout #interval #async

swnb-timer

lib that can register both timeout and interval callback,support sync and async style api

4 releases

0.2.0 Feb 20, 2023
0.1.2 Nov 1, 2022
0.1.1 Nov 1, 2022
0.1.0 Oct 31, 2022

#26 in #timeout

Custom license

18KB
319 lines

timer-rs

timer can execute a function, after waiting a specified number of time. also support async style api

install

  cargo add swnb-timer

set timeout callback

use std::{
    sync::{atomic::AtomicUsize, Arc},
    time::Duration,
};

use std::sync::atomic::Ordering::SeqCst;

use swnb_timer::Timer;

fn main(){
    let timer = Timer::new();
    let count = Arc::new(AtomicUsize::new(0));
    let count_clone = count.clone();
    let duration = Duration::from_secs(1);
    // count will increase after 1 sec
    let _ = timer.set_timeout(
        move || {
            count_clone.fetch_add(1, SeqCst);
            println!("run callback success");
        },
        duration,
    );

    std::thread::sleep(Duration::from_secs(2));
    assert_eq!(count.load(SeqCst), 1);
}

cancel callback

use std::{
    sync::{atomic::AtomicUsize, Arc},
    time::Duration,
};

use std::sync::atomic::Ordering::SeqCst;

use swnb_timer::Timer;

fn sleep(duration: Duration) {
    std::thread::sleep(duration);
}

fn main() {
    let timer = Timer::new();
    let count = Arc::new(AtomicUsize::new(1));
    let count_clone = count.clone();
    let cancel_timeout = timer.set_timeout(
        move || {
            count_clone.fetch_add(1, SeqCst);
            println!("run callback success");
        },
        Duration::from_secs(1),
    );

    sleep(Duration::from_millis(20));
    // cancel timeout callback;
    cancel_timeout();
    sleep(Duration::from_secs(1));
    // count still be 1;
    assert_eq!(count.load(SeqCst), 1);
}

use async function;

use std::time::Duration;

use swnb_timer::Timer;

async fn main() {
    let timer = Timer::new();

    // print count every 1 sec
    let async_block = async {
        let mut count = 1;
        loop {
            timer.wait(Duration::from_secs(1)).await;
            count += 1;
            println!("{count}");
        }
    };

    async_block.await;
}

No runtime deps