diff --git a/SysUtils.java b/SysUtils.java index a6a283b..994ea01 100644 --- a/SysUtils.java +++ b/SysUtils.java @@ -1,8 +1,32 @@ package a6; +import java.lang.reflect.Array; + public class SysUtils { public static void test() { System.out.println("test"); } + + public static int getDaySeconds(int time_val, int incdays) { + int time_zone = 8; + return (int)((time_val + time_zone * 3600)/3600/24 + incdays) * 3600 * 24 - 3600 * time_zone; + } + + public static int now() { + return (int)(System.currentTimeMillis() / 1000); + } + + public static final T[] newArray(Class cls, int size) { + T[] arr = (T[])Array.newInstance(cls, size); + try { + for (int i = 0; i < arr.length; ++i) { + arr[i] = cls.newInstance(); + } + return arr; + } catch (Exception e) { + return null; + } + } + } diff --git a/Timer.java b/Timer.java index ec8fd80..b96f99a 100644 --- a/Timer.java +++ b/Timer.java @@ -43,7 +43,13 @@ public class Timer { private void initTimerList(Timer timer, TimerType timer_type, int milli_seconds, XParams param, ITimerFunc timerFunc, ITimerAfterFunc afterFunc) { - + this.timerType = timer_type; + this.expires = timer.getTickCount.GetTickCount(timer.content) + milli_seconds; + this.milli_seconds = milli_seconds; + this.fixedTimerExecuteTimes = 0; + this.timerFunc = timerFunc; + this.timerAfterFunc = afterFunc; + this.param = param; } } @@ -63,11 +69,11 @@ public class Timer { private Object content; private int gcTime = 0; private int cacheTimerNum = 0; - private ListHead[] tv1 = new ListHead[TVR_SIZE]; - private ListHead[] tv2 = new ListHead[TVN_SIZE]; - private ListHead[] tv3 = new ListHead[TVN_SIZE]; - private ListHead[] tv4 = new ListHead[TVN_SIZE]; - private ListHead[] tv5 = new ListHead[TVN_SIZE]; + private ListHead[] tv1 = SysUtils.newArray(ListHead.class, TVR_SIZE); + private ListHead[] tv2 = SysUtils.newArray(ListHead.class, TVN_SIZE); + private ListHead[] tv3 = SysUtils.newArray(ListHead.class, TVN_SIZE); + private ListHead[] tv4 = SysUtils.newArray(ListHead.class, TVN_SIZE); + private ListHead[] tv5 = SysUtils.newArray(ListHead.class, TVN_SIZE); private ListHead workList = new ListHead(); private ListHead cascadeList = new ListHead(); @@ -79,7 +85,7 @@ public class Timer { } public void unInit() { - + clear(); } public void update() { @@ -140,6 +146,7 @@ public class Timer { ITimerAfterFunc after_func) { TimerList timer = newTimerList(); timer.initTimerList(this, TimerType.DEADLINE, expire_time, param, timer_func, after_func); + modifyTimer(timer, expire_time); return timer; } @@ -169,8 +176,22 @@ public class Timer { return timer; } - public void modifyTimer(TimerList timer_list, int expire_time) { - + public void modifyTimer(TimerList timer, int expire_time) { + detachTimer(timer); + if (timer.timerType == TimerType.FIXED) { + long tick = System.currentTimeMillis(); + int today_passed_seconds = SysUtils.now() - SysUtils.getDaySeconds(SysUtils.now(), 0); + timer.expires = (tick - today_passed_seconds * 1000) + expire_time; + if (timer.fixedTimerExecuteTimes > 0) { + if (timer.expires <= tick) { + timer.expires += 1000 * 3600 * 24; + } + } else { + timer.expires = getTickCount.GetTickCount(content) + expire_time; + } + } + timer.milli_seconds = expire_time; + internalAddTimer(timer); } public TimerList getTimerByAttach(ListHead attach_entry) { @@ -181,8 +202,9 @@ public class Timer { return timer_list.param; } - public long getRemainTime(TimerList timer_list) { - return 0; + public long getRemainTime(TimerList timer) { + long remain_time = timer.expires - getTickCount.GetTickCount(content); + return remain_time; } public TimerList getRunningTimer() { @@ -190,7 +212,14 @@ public class Timer { } public int getIdleableMillSeconds() { - return 0; + int idle_time = 1; + for (int lv1_idx = (int)(timerTick % TVR_MASK); lv1_idx < TVR_SIZE; ++lv1_idx) { + if (!tv1[lv1_idx].empty()){ + return idle_time <= 1 ? 1 : idle_time - 1; + } + ++idle_time; + } + return idle_time; } public void deleteTimer(TimerList timer_list) {