extern crate object_controller_tracker;
use object_controller_tracker::*;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::time::Duration;
struct Object {
stop: Arc<AtomicBool>,
}
struct Controller(Arc<AtomicBool>);
impl Object {
fn new2() -> (Object, Controller) {
let stop = Arc::new(AtomicBool::new(false));
let ctl_stop = Arc::clone(&stop);
(Object { stop }, Controller(ctl_stop))
}
fn do_something(&self) {
while !self.stop.load(Ordering::SeqCst) {
println!("Do something.");
std::thread::sleep(Duration::from_secs(1));
}
}
}
impl Controller {
fn cancel(&self) {
self.0.store(true, Ordering::SeqCst);
}
}
fn main() {
let mut tracker = Tracker::new();
let tracker2 = tracker.clone();
let thread = std::thread::spawn(move || {
let (object, controller) = Object::new2();
let object = tracker2.track(object, controller);
object.do_something();
});
std::thread::sleep(Duration::from_secs(5));
tracker.for_each(|r| r.cancel());
thread.join().unwrap();
}