[][src]Crate apex

A configurable, multi-threaded signals and slots implementation for Rust. Uses mpsc channels and a configurable event-loop-like system internally to allow for fully multi-threaded message handling without wasting cpu time.

Example

use apex::{Signal, Slot};
use std::sync::{ Arc, atomic::{
    AtomicBool, AtomicI32, Ordering }
};
use std::time::Duration;

//create a slot that will poll continuously for 10 milliseconds in 10 millisecond intervals
let mut slot = Slot::<i32>::new(Duration::from_millis(10), Duration::from_millis(10));
let mut sig = Signal::<i32>::new();

let multiply = Arc::new(AtomicBool::new(true));
let multiply_cloned = multiply.clone();
let num = Arc::new(AtomicI32::new(5));
let num_cloned = num.clone();

slot.connect(&mut sig);
let callback = move |t: i32| {
    if multiply_cloned.load(Ordering::Relaxed) {
        let mut temp = num_cloned.load(Ordering::Relaxed);
        temp *= t;
        num_cloned.store(temp, Ordering::Release);
    }
    else {
        let mut temp = num_cloned.load(Ordering::Relaxed);
        temp /= t;
        num_cloned.store(temp, Ordering::Relaxed);
    }
};
slot.open(callback);

sig.emit(5);
//in practice this would be using some sort of timing synchronization mechanism,
//but this is good enough for this simple test/example to make sure the 'emit' has finished
//before 'assert' gets called
std::thread::sleep(std::time::Duration::from_millis(10));

let multiplied = num.load(Ordering::Relaxed);
assert_eq!(multiplied, 25);
multiply.store(false, Ordering::Relaxed);
//ditto above
std::thread::sleep(std::time::Duration::from_millis(10));

sig.emit(25);
//ditto above
std::thread::sleep(std::time::Duration::from_millis(10));

let divided = num.load(Ordering::Relaxed);
assert_eq!(divided, 1);
slot.close();

Structs

Signal

Signal component of the Signals and Slots implementation. This uses mpsc channels provided by 'crossbeam' internally for communication between this and connected Slots

Slot

Slot component of the Signals and Slots implementation. This uses mpsc channels provided by 'crossbeam' internally for communication between this and connected 'Signal's

Enums

SignalError

Error Type for Signal-related actions

SlotError

Error type for Slot-related actions