当我使用大于2 ^ 31的数字设置定时器延迟时,定时器会立即触发事件。为什么会发生这种情况?我看到API引用延迟是数字类型,所以它可以处理大于2 ^ 31的数字。
我该如何解决这个问题?
var cou: Number = diff - now.getTime()
var timer: Timer = new Timer(cou, 1);
trace(cou + " timer delay " + timer.delay)
add(misbox, new Date(diff) + " " + para);
timer.addEventListener(TimerEvent.TIMER, te1);
timer.start();
function te1(event: Event): void {
trace(new Date(diff) + " " + para);
}
API参考引用:
Timer()构造函数 public function Timer(delay:Number,repeatCount:int = 0)
语言版本:ActionScript 3.0 运行时版本:AIR 1.0,Flash Player 9,Flash Lite 4
构造一个具有指定延迟和repeatCount状态的新Timer对象。
计时器不会自动启动;你必须调用start()方法来启动它。
参数 delay:Number - 定时器事件之间的延迟,以毫秒为单位。建议不要延迟低于20毫秒。定时器频率限制为每秒60帧,这意味着低于16.6毫秒的延迟会导致运行时问题。
repeatCount:int(default = 0) - 指定重复次数。如果为零,则计时器无限重复,最多为最大24.86天(int.MAX_VALUE + 1)。如果非零,则计时器运行指定的次数,然后停止。
我认为如果事件发生在24.86天之后,计时器将立即触发。
如何在24.86天之后触发事件?
答案 0 :(得分:1)
将延迟设置为复合,在delay
构造函数中设置count
和Timer
值,这样您就可以设置为(2 ^ 31)^ 2,然后侦听flash.events.TimerEvent.TIMER_COMPLETE
触发延迟功能。
如果您无法将所需的延迟分解为两个2 ^ 31-1或更少的数字,请选择数字以使化合物尽可能接近所需的延迟。
一个例子:
var cou:Number = diff-now.getTime();
var td:int;
var tc:int;
if (cou<2147483647) { td=Math.floor(cou); tc=1; }
else {
// stupid, do a square root and use its floor as both td and tc
td=Math.floor(Math.sqrt(cou));
tc=td;
}
var timer: Timer = new Timer(td, tc);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, te1);
timer.start();
答案 1 :(得分:0)
将计时器设置为2 ^ 31,当它达到2 ^ 31时,将第二个变量递增1,当计时器再次达到2 ^ 31时,将第二个变量递增1,执行此操作直到有足够的时间通过然后做你的行动。