Make sure the dialog is destroyed after use (otherwise, it hangs
around on the screen sometimes).
Switch timeout before showing dialog to 500ms -- that brings the
dialog up less often when unnecessary.
Use 'timeout_started' boolean to indicate whether the I/O thread has
queued the dialog for display and whether it needs to queue a call to
close it down.
Signed-off-by: Keith Packard <keithp@keithp.com>
boolean timeout_started = false;
private void stop_timeout_dialog() {
boolean timeout_started = false;
private void stop_timeout_dialog() {
- Runnable r = new Runnable() {
- public void run() {
- if (timeout_dialog != null)
+ if (timeout_started) {
+ timeout_started = false;
+ Runnable r = new Runnable() {
+ public void run() {
timeout_dialog.setVisible(false);
timeout_dialog.setVisible(false);
- }
- };
- SwingUtilities.invokeLater(r);
+ }
+ };
+ SwingUtilities.invokeLater(r);
+ }
}
private void start_timeout_dialog_internal() {
}
private void start_timeout_dialog_internal() {
Object[] options = { "Cancel" };
JOptionPane pane = new JOptionPane();
Object[] options = { "Cancel" };
JOptionPane pane = new JOptionPane();
return;
if (options[0].equals(o))
abort = true;
return;
if (options[0].equals(o))
abort = true;
+ timeout_dialog.dispose();
+ timeout_dialog = null;
}
private boolean check_timeout() {
if (!timeout_started && frame != null) {
}
private boolean check_timeout() {
if (!timeout_started && frame != null) {
- timeout_started = true;
if (!SwingUtilities.isEventDispatchThread()) {
if (!SwingUtilities.isEventDispatchThread()) {
+ timeout_started = true;
Runnable r = new Runnable() {
public void run() {
start_timeout_dialog_internal();
Runnable r = new Runnable() {
public void run() {
start_timeout_dialog_internal();
int timeout = 100;
if (remote)
int timeout = 100;
if (remote)
do {
try {
Thread.sleep(timeout);
do {
try {
Thread.sleep(timeout);
public String get_reply(int timeout) throws InterruptedException {
boolean can_cancel = true;
public String get_reply(int timeout) throws InterruptedException {
boolean can_cancel = true;
if (SwingUtilities.isEventDispatchThread()) {
can_cancel = false;
System.out.printf("Uh-oh, reading serial device from swing thread\n");
}
flush_output();
if (remote && can_cancel) {
if (SwingUtilities.isEventDispatchThread()) {
can_cancel = false;
System.out.printf("Uh-oh, reading serial device from swing thread\n");
}
flush_output();
if (remote && can_cancel) {
}
abort = false;
timeout_started = false;
}
abort = false;
timeout_started = false;
AltosLine line = reply_queue.poll(timeout, TimeUnit.MILLISECONDS);
if (line != null) {
stop_timeout_dialog();
AltosLine line = reply_queue.poll(timeout, TimeUnit.MILLISECONDS);
if (line != null) {
stop_timeout_dialog();
- if (!remote || !can_cancel || check_timeout())
+ if (!remote || !can_cancel || check_timeout()) {
+ --in_reply;
+ if (in_reply != 0)
+ System.out.printf("Uh-oh. Closing active serial device\n");
+
if (altos != null) {
libaltos.altos_close(altos);
}
if (altos != null) {
libaltos.altos_close(altos);
}