first commit
This commit is contained in:
commit
63a9734b46
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/target
|
||||
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "loader"
|
||||
version = "0.1.0"
|
||||
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "loader"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
18
src/lib.rs
Normal file
18
src/lib.rs
Normal file
@ -0,0 +1,18 @@
|
||||
pub use std::sync::mpsc::TryRecvError;
|
||||
use std::sync::mpsc::{self, Receiver};
|
||||
|
||||
pub struct Loader<T> {
|
||||
rx: Receiver<T>,
|
||||
}
|
||||
|
||||
impl<T: Send + 'static> Loader<T> {
|
||||
pub fn new<F: FnOnce() -> T + Send + 'static>(f: F) -> Loader<T> {
|
||||
let (tx, rx) = mpsc::sync_channel(0);
|
||||
std::thread::spawn(move || tx.send(f()).unwrap());
|
||||
return Loader { rx };
|
||||
}
|
||||
#[inline(always)]
|
||||
pub fn try_recv(&self) -> Result<T, TryRecvError> {
|
||||
self.rx.try_recv()
|
||||
}
|
||||
}
|
||||
46
src/main.rs
Normal file
46
src/main.rs
Normal file
@ -0,0 +1,46 @@
|
||||
use loader::{Loader, TryRecvError};
|
||||
use std::{
|
||||
io::{self, stdout, Write},
|
||||
num::IntErrorKind,
|
||||
time::{Duration, Instant},
|
||||
};
|
||||
|
||||
const FPS: u64 = 12;
|
||||
const NSPF: u64 = ((1.0 / FPS as f64) * 1.0e9) as u64;
|
||||
const FRAME_DUR: Duration = Duration::from_nanos(NSPF);
|
||||
|
||||
fn main() {
|
||||
let stdin = io::stdin();
|
||||
loop {
|
||||
print!("How many seconds: ");
|
||||
stdout().flush().unwrap();
|
||||
let mut input = String::new();
|
||||
stdin.read_line(&mut input).unwrap();
|
||||
let seconds: u64 = match input.strip_suffix("\n").unwrap_or(&input).parse() {
|
||||
Ok(i) => i,
|
||||
Err(e) if *e.kind() == IntErrorKind::Empty => break,
|
||||
Err(e) => {
|
||||
println!("Error parsing number: {:?}", e.kind());
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
let loader: Loader<String> = Loader::new(move || {
|
||||
std::thread::sleep(Duration::from_secs(seconds));
|
||||
return format!("Hello World {}", seconds);
|
||||
});
|
||||
let start = Instant::now();
|
||||
|
||||
let mut res = loader.try_recv();
|
||||
while res == Err(TryRecvError::Empty) {
|
||||
print!("\rWaiting... {:.2}s", start.elapsed().as_secs_f32());
|
||||
std::io::stdout().flush().unwrap();
|
||||
std::thread::sleep(FRAME_DUR);
|
||||
res = loader.try_recv();
|
||||
}
|
||||
|
||||
let elapsed = start.elapsed();
|
||||
println!("\nDone! {:.2}s", elapsed.as_secs_f32());
|
||||
println!("{}\n", res.unwrap());
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user