当前位置: 首页 > 知识库问答 >
问题:

定时器嵌套

易弘阔
2023-03-14

这篇文章与我的上一篇文章有关。代码块在所需的时间后将文本更改为所需的颜色。然而,现在我想更改一个网格单词的颜色,以便每个字母获得相等的时间。例如,如果“你好”被给予1000毫秒的时间(有5个字母),那么“h”e“l”l“o”每个字母应该获得1000/5毫秒,即每个字母200毫秒。

我为此实现了swing timer:

public Reminder() {

    a[0]=2000;
    a[1]=1000;
    a[2]=3000;
   a[3]=5000;
    a[4]=3000;
ActionListener actionListener = new ActionListener() {
  public void actionPerformed(ActionEvent actionEvent) {
  point =point +arr[i].length();
i++;

     doc.setCharacterAttributes(0,point+1, textpane.getStyle("Red"), true);
     timer.setDelay(a[i]);

    }
};

timer = new Timer(a[i], actionListener);
timer.setInitialDelay(0);
timer.start();

为了实现这一点,我应该在actionListener中使用另一个计时器来进一步计时一封特定的信吗?或者我应该先用打破时间。length()然后使用计时器?我无法决定更好的方法。有什么想法吗?

共有1个答案

鄢松
2023-03-14

你永远不应该需要超过一个计时器。因为你提前知道所有事情应该发生的确切时间,所以只需计算这些时间,将它们放入一个列表(按时间排序),然后执行每个时间。

public colorize(int offset, int length) {
    long triggerTime[] = new long[length];
    long startTime = System.currentTimeMillis();
    for (int i=0; i<length; i++) {
         triggerTime[i] = startTime + (1000*i)/length;
    }

    for (int i=0; i<length; i++) {
        //just wait for the next time to occur
        Thread.sleep(triggerTime[i]-System.currentTimeMillis());
        doc.setCharacterAttributes(offset, i+1, textpane.getStyle("Red"), true);
    }
}

这可能会让你觉得很平淡,因为它没有使用TimerWork对象,但是它是有效的,高效的,易于调试的。你可以在任何你想要的线程上简单地调用这个方法,它占据了整个线程,这个单词将以1秒钟内完成的速度着色。

如果手头没有线程,可以制作一个计时器来调用它,但唯一的原因是访问线程。真正的要点是:不要设置多个计时器,只需要创建一个时间值数组。满足一个事件后,设置为延迟到下一次。你永远不需要多个计时器。

如果你制作了一个代表一个角色(或任何你想要的动作)的颜色的对象,并将这些动作组合在一起,这会更干净一些。然后按时间对整个收藏进行排序。上面的循环将遍历集合,等待操作的时间到来,然后执行它。这种方法的另一个优点是可以清除集合,从而终止循环。

查看我的网站上关于过度使用计时器的讨论,了解为什么这是不好的。

 类似资料:
  • GatewayWorker是基于Workerman开发的,Workerman定时器在GatewayWorker中也同样支持,用法与Wokerman的定时器用法相同。参见Workerman手册定时器 示例 use WorkermanLibTimer; class Events { // 进程启动时设置个定时器。Events中支持onWorkerStart需要Gateway版本>=2.0.4

  • 定时器用于将一些操作推迟到指定时间之后执行。LCUI 的定时器都是在主线程中处理的,这意味着定时器的时间粒度受到帧率的限制,不能小于每帧的停留时间。举个例子:当前帧率为 120 帧每秒,那么时间粒度就是 8.33 毫秒,如果你设置定时器的等待时间是 20 毫秒,那么实际的等待时间会大于等于 25 毫秒,也就在设置定时器后的第三帧时处理这个定时器。这种精确度的定时器能够应付大多数场景,如果你需要更加

  • Microsoft Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。您的程序将时间间隔告诉Windows,例如「每10秒钟通知我一声」,然后Windows给您的程序发送周期性发生的WM_TIMER消息以表示时间到了。 初看之下,Windows定时器似乎不如键盘和鼠标设备重要,而且对许多应用程序来说确实如此。但是,定时器比您可能认为的要重要得多,它不只用

  • JavaScript 提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成。它们向任务队列添加定时任务。 setTimeout() setTimeout函数用来指定某个函数或某段代码,在多少毫秒之后执行。它返回一个整数,表示定时器的编号,以后可以用来取消这个定时器。 var timerId = setTimeout(func|

  • JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成。 setTimeout() setInterval() clearTimeout(),clearInterval() 运行机制 setTimeout(f,0) 含义 应用 参考链接 setTimeout() setTimeout函数用来指定某个函数或某段

  • 定时器 成员变量 变量 类型 名称 备注 interval number 每调用60次所需的秒时 例如:1代表 1秒调用60次。2代表2秒内调用60 。即1代表60帧/秒 2代表 30帧/秒 paused boolean 暂停 true代表暂停,false代表运行 方法 dispose() 销毁当前对象 返回值:无 例子: var t = new BK.Ticker(); t.dispose()