X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosui%2FAltosDisplayThread.java;h=ce8d9159e7de420e9573806dec5d53217dd50539;hp=3e719130a6a7c67475f41d98a8740b9904e66e01;hb=c3314dae2d3df82e188daf6ba8520cce833592c6;hpb=51c7741040d95c5deece939dae5e4136cc04afc4 diff --git a/altosui/AltosDisplayThread.java b/altosui/AltosDisplayThread.java index 3e719130..ce8d9159 100644 --- a/altosui/AltosDisplayThread.java +++ b/altosui/AltosDisplayThread.java @@ -33,16 +33,48 @@ public class AltosDisplayThread extends Thread { Frame parent; IdleThread idle_thread; AltosVoice voice; - String name; AltosFlightReader reader; int crc_errors; AltosFlightDisplay display; - synchronized void show(AltosState state, int crc_errors) { + void show_internal(AltosState state, int crc_errors) { if (state != null) display.show(state, crc_errors); } + void show_safely(AltosState in_state, int in_crc_errors) { + final AltosState state = in_state; + final int crc_errors = in_crc_errors; + Runnable r = new Runnable() { + public void run() { + try { + show_internal(state, crc_errors); + } catch (Exception ex) { + } + } + }; + SwingUtilities.invokeLater(r); + } + + void reading_error_internal() { + JOptionPane.showMessageDialog(parent, + String.format("Error reading from \"%s\"", reader.name), + "Telemetry Read Error", + JOptionPane.ERROR_MESSAGE); + } + + void reading_error_safely() { + Runnable r = new Runnable() { + public void run() { + try { + reading_error_internal(); + } catch (Exception ex) { + } + } + }; + SwingUtilities.invokeLater(r); + } + class IdleThread extends Thread { boolean started; @@ -102,7 +134,7 @@ public class AltosDisplayThread extends Thread { ++reported_landing; if (state.state != Altos.ao_flight_landed) { state.state = Altos.ao_flight_landed; - show(state, 0); + show_safely(state, 0); } } } @@ -202,7 +234,6 @@ public class AltosDisplayThread extends Thread { idle_thread = new IdleThread(); - display.reset(); try { for (;;) { try { @@ -212,23 +243,20 @@ public class AltosDisplayThread extends Thread { old_state = state; state = new AltosState(record, state); reader.update(state); - show(state, crc_errors); + show_safely(state, crc_errors); told = tell(state, old_state); idle_thread.notice(state, told); } catch (ParseException pp) { System.out.printf("Parse error: %d \"%s\"\n", pp.getErrorOffset(), pp.getMessage()); } catch (AltosCRCException ce) { ++crc_errors; - show(state, crc_errors); + show_safely(state, crc_errors); } } } catch (InterruptedException ee) { interrupted = true; } catch (IOException ie) { - JOptionPane.showMessageDialog(parent, - String.format("Error reading from \"%s\"", name), - "Telemetry Read Error", - JOptionPane.ERROR_MESSAGE); + reading_error_safely(); } finally { if (!interrupted) idle_thread.report(true); @@ -245,5 +273,6 @@ public class AltosDisplayThread extends Thread { voice = in_voice; display = in_display; reader = in_reader; + display.reset(); } }