Skip to content

Commit 41cd8cd

Browse files
committed
examples/winit_multithread: Make thread persistent again
1 parent 56c8f15 commit 41cd8cd

File tree

1 file changed

+15
-20
lines changed

1 file changed

+15
-20
lines changed

examples/winit_multithread.rs

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,15 @@ mod ex {
1919

2020
fn render_thread(
2121
window: Arc<Window>,
22-
surface: Arc<Mutex<Surface>>,
23-
do_render: mpsc::Receiver<()>,
22+
do_render: mpsc::Receiver<Arc<Mutex<Surface>>>,
2423
done: mpsc::Sender<()>,
2524
) {
2625
loop {
2726
println!("waiting for render...");
28-
if do_render.recv().is_err() {
29-
println!("surface state destroyed");
27+
let Ok(surface) = do_render.recv() else {
28+
println!("main thread destroyed");
3029
break;
31-
}
30+
};
3231

3332
// Perform the rendering.
3433
let mut surface = surface.lock().unwrap();
@@ -73,15 +72,6 @@ mod ex {
7372

7473
let context = softbuffer::Context::new(window.clone()).unwrap();
7574

76-
(window, context)
77-
},
78-
|_elwt, (window, context)| {
79-
let surface = {
80-
println!("making surface...");
81-
let surface = softbuffer::Surface::new(context, window.clone()).unwrap();
82-
Arc::new(Mutex::new(surface))
83-
};
84-
8575
// Spawn a thread to handle rendering for this specific surface. The channels will
8676
// be closed and the thread will be stopped whenever this surface (the returned
8777
// context below) is dropped, so that it can all be recreated again (on Android)
@@ -91,28 +81,33 @@ mod ex {
9181
println!("starting thread...");
9282
std::thread::spawn({
9383
let window = window.clone();
94-
let surface = surface.clone();
95-
move || render_thread(window, surface, do_render, render_done)
84+
move || render_thread(window, do_render, render_done)
9685
});
9786

98-
(surface, start_render, finish_render)
87+
(window, context, start_render, finish_render)
88+
},
89+
|_elwt, (window, context, _start_render, _finish_render)| {
90+
println!("making surface...");
91+
Arc::new(Mutex::new(
92+
softbuffer::Surface::new(context, window.clone()).unwrap(),
93+
))
9994
},
10095
)
10196
.with_event_handler(|state, surface, event, elwt| {
102-
let (window, _context) = state;
97+
let (window, _context, start_render, finish_render) = state;
10398
elwt.set_control_flow(ControlFlow::Wait);
10499

105100
match event {
106101
Event::WindowEvent {
107102
window_id,
108103
event: WindowEvent::RedrawRequested,
109104
} if window_id == window.id() => {
110-
let Some((_surface, start_render, finish_render)) = surface else {
105+
let Some(surface) = surface else {
111106
eprintln!("RedrawRequested fired before Resumed or after Suspended");
112107
return;
113108
};
114109
// Start the render and then finish it.
115-
start_render.send(()).unwrap();
110+
start_render.send(surface.clone()).unwrap();
116111
finish_render.recv().unwrap();
117112
}
118113
Event::WindowEvent {

0 commit comments

Comments
 (0)