diff options
Diffstat (limited to 'src/com/isode')
-rw-r--r-- | src/com/isode/stroke/network/JavaTimer.java | 54 | ||||
-rw-r--r-- | src/com/isode/stroke/network/JavaTimerFactory.java | 4 | ||||
-rw-r--r-- | src/com/isode/stroke/network/TimerFactory.java | 4 |
3 files changed, 44 insertions, 18 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_; } diff --git a/src/com/isode/stroke/network/JavaTimerFactory.java b/src/com/isode/stroke/network/JavaTimerFactory.java index 9326f76..7586e74 100644 --- a/src/com/isode/stroke/network/JavaTimerFactory.java +++ b/src/com/isode/stroke/network/JavaTimerFactory.java @@ -4,7 +4,7 @@ * See Documentation/Licenses/GPLv3.txt for more information. */ /* - * Copyright (c) 2010, Isode Limited, London, England. + * Copyright (c) 2010-2012, Isode Limited, London, England. * All rights reserved. */ @@ -18,7 +18,7 @@ public class JavaTimerFactory implements TimerFactory { eventLoop_ = eventLoop; } - public Timer createTimer(int milliseconds) { + public Timer createTimer(long milliseconds) { return new JavaTimer(eventLoop_, milliseconds); } diff --git a/src/com/isode/stroke/network/TimerFactory.java b/src/com/isode/stroke/network/TimerFactory.java index d3325ac..ac53e48 100644 --- a/src/com/isode/stroke/network/TimerFactory.java +++ b/src/com/isode/stroke/network/TimerFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Isode Limited, London, England. + * Copyright (c) 2010-2012, Isode Limited, London, England. * All rights reserved. */ /* @@ -11,5 +11,5 @@ package com.isode.stroke.network; public interface TimerFactory { - Timer createTimer(int milliseconds); + Timer createTimer(long milliseconds); } |