diff options
Diffstat (limited to 'src/com/isode/stroke/network/JavaTimer.java')
-rw-r--r-- | src/com/isode/stroke/network/JavaTimer.java | 54 |
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_; } |