1extern crate object_controller_tracker;
2use object_controller_tracker::*;
3use std::sync::atomic::{AtomicBool, Ordering};
4use std::sync::Arc;
5use std::time::Duration;
6
7struct Object {
9 stop: Arc<AtomicBool>,
10 }
12
13struct Controller(Arc<AtomicBool>);
15
16impl Object {
17 fn new2() -> (Object, Controller) {
19 let stop = Arc::new(AtomicBool::new(false));
20 let ctl_stop = Arc::clone(&stop);
21 (Object { stop }, Controller(ctl_stop))
22 }
23
24 fn do_something(&self) {
26 while !self.stop.load(Ordering::SeqCst) {
27 println!("Do something.");
28 std::thread::sleep(Duration::from_secs(1));
29 }
30 }
31}
32
33impl Controller {
34 fn cancel(&self) {
36 self.0.store(true, Ordering::SeqCst);
37 }
38}
39
40fn main() {
41 let mut tracker = Tracker::new();
43
44 let tracker2 = tracker.clone();
45 let thread = std::thread::spawn(move || {
46 let (object, controller) = Object::new2();
48
49 let object = tracker2.track(object, controller);
51
52 object.do_something();
54 });
55
56 std::thread::sleep(Duration::from_secs(5));
57
58 tracker.for_each(|r| r.cancel());
60
61 thread.join().unwrap();
62}