summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/network/JavaTimer.java')
-rw-r--r--src/com/isode/stroke/network/JavaTimer.java54
1 files changed, 40 insertions, 14 deletions
diff --git a/src/com/isode/stroke/network/JavaTimer.java b/src/com/isode/stroke/network/JavaTimer.java
index bcd37d5..ac9e219 100644
--- a/src/com/isode/stroke/network/JavaTimer.java
+++ b/src/com/isode/stroke/network/JavaTimer.java
@@ -9,6 +9,8 @@
*/
package com.isode.stroke.network;
+import java.util.Date;
+
import com.isode.stroke.eventloop.Event;
import com.isode.stroke.eventloop.EventLoop;
@@ -18,28 +20,33 @@ class JavaTimer extends Timer {
boolean running_ = true;
private final EventLoop eventLoop_;
- private final int milliseconds_;
+ private final long milliseconds_;
- public TimerRunnable(EventLoop eventLoop, int milliseconds) {
+ public TimerRunnable(EventLoop eventLoop, long milliseconds) {
eventLoop_ = eventLoop;
milliseconds_ = milliseconds;
}
public void run() {
- while (shouldEmit()) {
+ long endTime = new Date().getTime() + milliseconds_;
+ while (shouldEmit() && new Date().getTime() < endTime) {
try {
- Thread.sleep(milliseconds_);
+ long timeToWait = endTime - new Date().getTime();
+ if (timeToWait > 0) {
+ Thread.sleep(milliseconds_);
+ }
} catch (InterruptedException ex) {
- /* If we were interrupted, either emit or don't, based on whether stop was called.*/
- }
- if (shouldEmit()) {
- eventLoop_.postEvent(new Event.Callback() {
- public void run() {
- onTick.emit();
- }
- });
+ // Needs to be caught, but won't break out of the loop
+ // unless end time reached or stop() has been called.
}
- }
+ }
+ if (shouldEmit()) {
+ eventLoop_.postEvent(new Event.Callback() {
+ public void run() {
+ onTick.emit();
+ }
+ });
+ }
}
@@ -52,10 +59,19 @@ class JavaTimer extends Timer {
}
}
- public JavaTimer(EventLoop eventLoop, int milliseconds) {
+ /**
+ * Create a new JavaTimer
+ * @param eventLoop the caller's EventLoop. Should not be null.
+ * @param milliseconds length of delay.
+ */
+ public JavaTimer(EventLoop eventLoop, long milliseconds) {
timer_ = new TimerRunnable(eventLoop, milliseconds);
}
+ /**
+ * Start the timer running. The timer will expire and generate a signal
+ * after the specified delay, unless {@link #stop()} has been called.
+ */
@Override
public void start() {
Thread thread = (new Thread(timer_));
@@ -63,10 +79,20 @@ class JavaTimer extends Timer {
thread.start();
}
+ /**
+ * Cancel the timer. No signal will be generated.
+ */
@Override
public void stop() {
timer_.stop();
//FIXME: This needs to clear any remaining events out of the EventLoop queue.
}
+
+ @Override
+ public String toString() {
+ return "JavaTimer for " + timer_.milliseconds_ +
+ " milliseconds " +
+ (timer_.running_ ? "running" : "not running");
+ }
private final TimerRunnable timer_;
}