extern crate glib;
extern crate glib_itc;
extern crate gtk;
use std::thread;
use std::sync::{Arc, Mutex};
use std::sync::atomic::AtomicUsize;
use std::sync::atomic::Ordering::Relaxed;
use std::time::Duration;
use glib::Continue;
use glib_itc::channel;
fn main() {
gtk::init().unwrap();
let num = AtomicUsize::new(0);
let (sender, mut receiver) = channel();
let sender = Arc::new(Mutex::new(sender));
{
let sender = sender.clone();
thread::spawn(move || {
for _ in 0..3 {
{
let mut sender = sender.lock().unwrap();
sender.send();
}
println!("500ms");
thread::sleep(Duration::from_millis(500));
}
});
}
thread::spawn(move || {
for _ in 0..5 {
{
let mut sender = sender.lock().unwrap();
sender.send();
}
println!("Send");
thread::sleep(Duration::from_millis(1000));
}
println!("End");
let mut sender = sender.lock().unwrap();
sender.send();
});
receiver.connect_recv(move || {
let value = num.load(Relaxed) + 1;
num.store(value, Relaxed);
println!("Received");
if value > 8 {
gtk::main_quit();
Continue(false)
}
else {
Continue(true)
}
});
gtk::main();
}