Do not crash application when a single painter fails, just reconnect

This commit is contained in:
timvisee
2018-12-28 22:33:35 +01:00
parent 74d3f16bc8
commit 4f5a0b9274
3 changed files with 31 additions and 14 deletions

View File

@@ -31,8 +31,8 @@ fn start<'a>(arg_handler: &ArgHandler<'a>) {
println!("Starting... (use CTRL+C to stop)"); println!("Starting... (use CTRL+C to stop)");
// Gather facts about the host // Gather facts about the host
let screen_size = let screen_size = gather_host_facts(&arg_handler)
gather_host_facts(&arg_handler).expect("Failed to gather facts about pixelflut server"); .expect("Failed to gather facts about pixelflut server");
// Determine the size to use // Determine the size to use
let size = arg_handler.size(Some(screen_size)); let size = arg_handler.size(Some(screen_size));

View File

@@ -1,6 +1,7 @@
use std::sync::mpsc; use std::sync::mpsc::{self, Receiver, Sender};
use std::sync::mpsc::{Receiver, Sender}; use std::thread::sleep;
use std::thread; use std::thread;
use std::time::Duration;
use image::DynamicImage; use image::DynamicImage;
@@ -68,15 +69,32 @@ impl Canvas {
// Create the painter thread // Create the painter thread
let thread = thread::spawn(move || { let thread = thread::spawn(move || {
// Create a new client
let client = Client::connect(host).expect("failed to open stream to pixelflut");
// Create a painter
let mut painter = Painter::new(client, area, offset, None);
// Do some work
loop { loop {
painter.work(&rx).expect("Painter failed to perform work"); 'paint: loop {
// Create a new client
let client = match Client::connect(host.clone()) {
Ok(client) => client,
Err(e) => {
eprintln!("Painter failed to connect: {}", e);
break 'paint;
},
};
// Create a painter
let mut painter = Painter::new(client, area, offset, None);
// Keep painting
loop {
if let Err(e) = painter.work(&rx) {
println!("Painter error: {}", e);
break 'paint;
}
}
}
// Sleep for half a second before restarting the painter
sleep(Duration::from_millis(500));
println!("Restarting failed painter...");
} }
}); });

View File

@@ -87,8 +87,7 @@ impl Client {
// TODO: make flushing configurable? // TODO: make flushing configurable?
// TODO: make buffer size configurable? // TODO: make buffer size configurable?
self.stream self.stream
.flush() .flush()?;
.expect("failed to flush write buffer to server");
// Everything seems to be ok // Everything seems to be ok
Ok(()) Ok(())