Crates.io | object-controller-tracker |
lib.rs | object-controller-tracker |
version | 0.1.0 |
source | src |
created_at | 2019-04-07 15:22:53.959143 |
updated_at | 2019-04-07 15:22:53.959143 |
description | Track object-controller pairs. |
homepage | https://github.com/Emm54321/object-controller-tracker |
repository | https://github.com/Emm54321/object-controller-tracker.git |
max_upload_size | |
id | 126364 |
size | 25,922 |
A crate used to keep track of Object-Controller
pairs, where a
Controller
is used to operate on the Object
(e.g. to cancel it),
usually from an other thread.
A Tracker object is constructed and used to
register Object-Controller
pairs. When an Object
is dropped, the
Controller
is automatically unregistered. The
Tracker object can be used to operate on
all registered objects through their associated controllers.
// The object we want to track...
struct Object {
stop: Arc<AtomicBool>,
//...
}
// ... and its associated controller.
struct Controller(Arc<AtomicBool>);
impl Object {
// Create an Object-Controller pair.
fn new2() -> (Object, Controller) {
let stop = Arc::new(AtomicBool::new(false));
let ctl_stop = Arc::clone(&stop);
(Object { stop }, Controller(ctl_stop))
}
// Some method on the object that can be cancelled through the Controller.
fn do_something(&self) {
while !self.stop.load(Ordering::SeqCst) {
println!("Do something.");
std::thread::sleep(Duration::from_secs(1));
}
}
}
impl Controller {
// Cancel an operation on the Object.
fn cancel(&self) {
self.0.store(true, Ordering::SeqCst);
}
}
fn main() {
// Create the tracker object.
let mut tracker = Tracker::new();
let tracker2 = tracker.clone();
let thread = std::thread::spawn(move || {
// Create an Object-Controller pair in some thread.
let (object, controller) = Object::new2();
// Register it with the tracker.
let object = tracker2.track(object, controller);
// Do some work with the Object.
object.do_something();
});
std::thread::sleep(Duration::from_secs(5));
// Cancel all registered Object operations.
tracker.for_each(|r| r.cancel());
thread.join().unwrap();
}
License: MIT/Apache2.0