Skip to main content

threads/
threads.rs

1/// Threads test.
2/// This is a test to draw with the glfw RenderContext shareable between thread.
3#[macro_use]
4extern crate gust_render as gust;
5extern crate glfw;
6
7use gust::prelude::*;
8use gust::shared_window::SharedWindow;
9use std::rc::Rc;
10use std::sync::mpsc;
11use std::thread;
12
13fn main() {
14    let mut window = Window::new(gust::WIDTH, gust::HEIGHT, "Hello");
15    let event_handler = EventHandler::new(&window);
16    let mut shared = SharedWindow::new(&mut window);
17    let (send, recv) = mpsc::channel();
18
19    let renderer = thread::spawn(move || {
20        render(&mut shared, recv);
21    });
22
23    window.poll(None);
24    while window.is_open() {
25        window.poll_events();
26
27        for event in event_handler.fetch() {
28            match event.1 {
29                pressed!(Escape) => window.close(),
30                _ => {}
31            }
32        }
33    }
34    send.send(()).ok().expect("Failed to send ()");
35
36    renderer.join().unwrap();
37}
38
39fn render(shared: &mut SharedWindow, recv: mpsc::Receiver<()>) {
40    shared.active();
41    let texture_rc =
42        Rc::new(Texture::from_path("examples/texture/Dirt.png").expect("Cannot open New.png"));
43    let sprite = Sprite::from(&texture_rc);
44
45    loop {
46        if recv.try_recv() == Ok(()) {
47            break;
48        }
49        shared.clear(Color::red());
50        shared.draw(&sprite);
51        shared.display();
52    }
53}