example1/
example1.rs

1extern crate object_controller_tracker;
2use object_controller_tracker::*;
3use std::sync::atomic::{AtomicBool, Ordering};
4use std::sync::Arc;
5use std::time::Duration;
6
7// The object we want to track...
8struct Object {
9    stop: Arc<AtomicBool>,
10    //...
11}
12
13// ... and its associated controller.
14struct Controller(Arc<AtomicBool>);
15
16impl Object {
17    // Create an Object-Controller pair.
18    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    // Some method on the object that can be cancelled through the Controller.
25    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    // Cancel an operation on the Object.
35    fn cancel(&self) {
36        self.0.store(true, Ordering::SeqCst);
37    }
38}
39
40fn main() {
41    // Create the tracker object.
42    let mut tracker = Tracker::new();
43
44    let tracker2 = tracker.clone();
45    let thread = std::thread::spawn(move || {
46        // Create an Object-Controller pair in some thread.
47        let (object, controller) = Object::new2();
48
49        // Register it with the tracker.
50        let object = tracker2.track(object, controller);
51
52        // Do some work with the Object.
53        object.do_something();
54    });
55
56    std::thread::sleep(Duration::from_secs(5));
57
58    // Cancel all registered Object operations.
59    tracker.for_each(|r| r.cancel());
60
61    thread.join().unwrap();
62}