use pbr::MultiBar; use std::{ sync::{ atomic::{AtomicBool, Ordering}, Arc, }, thread, time::Duration, }; fn main() { let complete = Arc::new(AtomicBool::new(false)); let progress = Arc::new(MultiBar::new()); thread::spawn({ let complete = Arc::clone(&complete); let progress = Arc::clone(&progress); move || { for task in 1..=10 { thread::spawn({ let progress = Arc::clone(&progress); move || { let mut bar = progress.create_bar(100); bar.message(&format!("Task {}: ", task)); for _ in 0..100 { thread::sleep(Duration::from_millis(50)); bar.inc(); } bar.finish_print(&format!("Task {} Complete", task)); } }); thread::sleep(Duration::from_millis(1000)); } complete.store(true, Ordering::SeqCst); } }); while !complete.load(Ordering::SeqCst) { let _ = progress.listen(); thread::sleep(Duration::from_millis(1000)); } let _ = progress.listen(); }