diff --git a/src/com/sheepit/client/Client.java b/src/com/sheepit/client/Client.java index f116e0e..402c664 100644 --- a/src/com/sheepit/client/Client.java +++ b/src/com/sheepit/client/Client.java @@ -233,6 +233,7 @@ public class Client { Date wakeup_time = new Date(new Date().getTime() + time_sleep); this.gui.status(String.format("No job available. Sleeping for 15 minutes (will wake up at ~%tR)", wakeup_time)); this.gui.framesRemaining(0); + this.suspended = true; int time_slept = 0; while (time_slept < time_sleep && this.running == true) { try { @@ -243,6 +244,7 @@ public class Client { } time_slept += 5000; } + this.suspended = false; continue; // go back to ask job } @@ -342,6 +344,8 @@ public class Client { } this.server = null; + + this.gui.stop(); return 0; } diff --git a/src/com/sheepit/client/standalone/GuiText.java b/src/com/sheepit/client/standalone/GuiText.java index b8cb620..ae83f40 100644 --- a/src/com/sheepit/client/standalone/GuiText.java +++ b/src/com/sheepit/client/standalone/GuiText.java @@ -22,11 +22,16 @@ package com.sheepit.client.standalone; import com.sheepit.client.Client; import com.sheepit.client.Gui; import com.sheepit.client.Log; +import sun.misc.Signal; +import sun.misc.SignalHandler; public class GuiText implements Gui { public static final String type = "text"; private int framesRendered; + + private int sigIntCount = 0; + private Log log; private Client client; @@ -39,6 +44,30 @@ public class GuiText implements Gui { @Override public void start() { if (client != null) { + + Signal.handle(new Signal("INT"), new SignalHandler() { + @Override + public void handle(Signal signal) { + sigIntCount++; + + if (sigIntCount == 4) { + // This is only for ugly issues that might occur + System.out.println("WARNING: Hitting Ctrl-C again will force close the application."); + } + else if (sigIntCount == 5) { + Signal.raise(new Signal("INT")); + Runtime.getRuntime().halt(0); + } + else if (client.isRunning() && client.isSuspended() == false) { + client.askForStop(); + System.out.println("Will exit after current frame... Press Ctrl+C again to exit now."); + } + else { + client.stop(); + } + } + }); + client.run(); client.stop(); } @@ -46,6 +75,7 @@ public class GuiText implements Gui { @Override public void stop() { + Runtime.getRuntime().halt(0); } @Override diff --git a/src/com/sheepit/client/standalone/GuiTextOneLine.java b/src/com/sheepit/client/standalone/GuiTextOneLine.java index 0e0f957..f5b0a69 100644 --- a/src/com/sheepit/client/standalone/GuiTextOneLine.java +++ b/src/com/sheepit/client/standalone/GuiTextOneLine.java @@ -2,14 +2,20 @@ package com.sheepit.client.standalone; import com.sheepit.client.Client; import com.sheepit.client.Gui; +import sun.misc.Signal; +import sun.misc.SignalHandler; public class GuiTextOneLine implements Gui { public static final String type = "oneLine"; private int rendered; private int remaining; + private int sigIntCount = 0; + private String status; private String line; + + private boolean exiting = false; private Client client; @@ -23,6 +29,26 @@ public class GuiTextOneLine implements Gui { @Override public void start() { if (client != null) { + + Signal.handle(new Signal("INT"), new SignalHandler() { + @Override + public void handle(Signal signal) { + sigIntCount++; + + if (sigIntCount == 5) { + Signal.raise(new Signal("INT")); + Runtime.getRuntime().halt(0); + } + else if (client.isRunning() && client.isSuspended() == false) { + client.askForStop(); + exiting = true; + } + else { + client.stop(); + } + } + }); + client.run(); client.stop(); } @@ -30,6 +56,7 @@ public class GuiTextOneLine implements Gui { @Override public void stop() { + Runtime.getRuntime().halt(0); } @Override @@ -70,7 +97,7 @@ public class GuiTextOneLine implements Gui { int charToRemove = line.length(); System.out.print("\r"); - line = String.format("Frames rendered: %d remaining: %d | %s", rendered, remaining, status); + line = String.format("Frames rendered: %d remaining: %d | %s", rendered, remaining, status) + (exiting ? " (Exiting after this frame)" : ""); System.out.print(line); for (int i = line.length(); i <= charToRemove; i++) { System.out.print(" ");