如何设置延迟大于2147283648(2 ^ 31)的定时器?

时间:2015-05-21 08:47:33

标签: actionscript-3

当我使用大于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天之后触发事件?

2 个答案:

答案 0 :(得分:1)

将延迟设置为复合,在delay构造函数中设置countTimer值,这样您就可以设置为(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,执行此操作直到有足够的时间通过然后做你的行动。