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

摆动计时器:不要依赖摆动计时器。。问号;和并发性问题

倪振海
2023-03-14

我首先想到的是:系统。currentTimeMillis()我认为有点非常准确,给出了一个long值,其中asSwingTimers请求一个int参数;上面写着什么?不要认为<代码>摆动定时器<代码>是准确的吗?

2) 假设用SwingTimer计时一个单词需要x毫秒;如果我们在重复一项任务(突出显示一个单词,如卡拉OK应用程序),我会包含以下代码:

               /*see the time taken for each letter*/                    
                 int tik=(int) delay / words[index].length();
 /* make adjustment(subtract few millisecs)  as per the time taken by each word*/
                   if(tik <69)
                    timer.setDelay((int) (delay / words[index].length())-3);
                   if(tik >=69&&tik<=149)
                    timer.setDelay((int) (delay / words[index].length())-6);
                   else if(tik <=150)
                       timer.setDelay((int) (delay / words[index].length())-9);
                   else if(tik >150)
                   timer.setDelay((int) (delay / words[index].length())-100);

安静地工作很好,但我肯定我不能依靠这一点,因为时间,长度可能会改变!如何克服这个问题?因为几毫秒内的变化可能会给我带来灾难性的后果。

3) 同时,我想知道卡拉OK制作者需要哪些技巧

共有3个答案

空正豪
2023-03-14

我们必须承认,我们永远不能准时到达;我们可以早到也可以晚到。

考虑多年来,每秒24帧制作了连续观看的电影。现在,我们已经改到59 FPS了?所以,/-20ms左右对人类来说是不明显的。

如果您的应用程序需要电子级的精确定时,那么考虑调度和并发会导致各种各样的问题。当我在公元2000年前后在C******e工作时,这是一件大事,经常受到视频设置等因素的影响。与时间相关的问题表现为延迟、故障和音调不准确性。

说我们用的是当循环方法(原谅我的伪代码):

/**伪代码**/

something.idLikeToTriggerNow();

时间现在=时间然后=系统。获取微秒();

而(time_now

; //没有

时间=系统。获取微秒();

}

something.id:

/**结束psuedocode**/

这只能保证你在进入后一毫秒内不会离开。然而,不知何故,你可能会被打断获取系统时间,并在半秒钟后退出,因为可能是诺顿杀毒软件。我的观点与Java无关,尤其是。此外,即使while循环运行良好,下一个操作也可能会因您的NVidia驱动程序而延迟,这可能比您的Java应用程序在总体方案中具有更高的优先级。

Java中是否有一种方法使这两个事件相距1毫秒更有可能达到100 /-的容差?

井斌斌
2023-03-14

基于计算机/操作系统时钟的计时方法,不管时间源有多精确,通常都是有缺陷的,尽管在一些计时不需要那么精确的场景中,这种方法可能会很好。

一个聪明的方法是从你想要同步的东西中获取时间信息——所以对于卡拉OK来说,获取播放音频所经过的时间并对其做出响应。这种方法自然避免了常见的麻烦:处理(用户发起的)音频播放暂停,以及音频和系统硬件之间的微小时间偏差。

郎诚
2023-03-14

同时,我想知道卡拉OK制作人使用了哪些技巧

我猜卡拉ok软件有一个输入节拍和时间签名的引擎,音符时长(全音、半音、四分之一音等)和歌词一起输入。

引擎计算每四分音符的毫秒数,并根据计算结果一次显示一个字母。

我怀疑音符时长必须手动输入,但如果引擎听音乐并从音乐中确定音符时长,这将是非常有效的。

保持完美的时间

正如您已经确定的,Thread.sleep()和Swing计时器不能保持完美的时间。

如果你想精确计时,你就必须建立自己的计时器。这里有一个版本。

    public void moreAccurateTimer(int period) { // Sleep time in
                                                // milliseconds
        long beforeTime, timeDiff, sleepTime;
        beforeTime = System.currentTimeMillis();
        boolean running = true;
        while (running) {
            doStuff();

            timeDiff = System.currentTimeMillis() - beforeTime;
            sleepTime = period - timeDiff;

            if (sleepTime <= 0L) { // Even if doing stuff took longer than
                                    // period
                sleepTime = 5L; // sleep some anyway
            }

            try {
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {
            }

            beforeTime = System.currentTimeMillis();
        }
    }
 类似资料:
  • 我觉得摇摆计时器有问题。我写了一些运行良好的代码,然后将其全部移动到我的新计算机上,但它很快就无法工作。我用这个方法编写了一个GUI类(基于JFrame): 该方法是从另一个类调用的。真是太夸张了。splash guy是一个只运行splash动画的JPanel类。它通过摆动计时器来实现。在splash类中,侦听器通过以下代码调整我的帧的内容: 现在,如果第一个块中的print语句被注释掉,我的程序

  • 问题内容: 我在游戏中使用了摇摆计时器,但是当游戏运行时,它似乎有平稳运行的时刻和减速的时刻。 为什么时间在波动? 我该如何解决? 这是我的代码示例。在我的实际程序中,我正在绘制图像,而不仅仅是矩形。还有很多碰撞检测和其他小的计算正在发生。 另外,这是游戏的Jar文件的链接,因此您可以运行它,(满是)明白我的意思。http://dl.dropbox.com/u/8724803/Get%20To%2

  • 我在Swing和设置角色动画方面有一些问题,我有一个带有关键侦听器的JFrame,当用户点击时,它在这里调用我的JPanel方法 这个动画我的角色,但这么快,我们可以看到一个东西,我怎么才能看到动画?

  • 我正在用摇摆计时器打卡NetBeans: 我只是用System.out.print来测试程序,它不是真正程序的一部分。我调用停止()方法,但计时器继续计数。此外,我通过但它的计数速度是原来的两倍。有人能帮忙吗? 编辑: 这是我的计时器(有点像SSCCE): 它不能正常工作,因为秒没有出现,但它确实显示了20次,这就是我想要的。这只是在它自己的应用程序中,在我的实际程序中更容易看到问题。 我注意到游

  • 我有种感觉,我不知道swing Timer是如何工作的。我对JavaGUI API还是新手,我编写的程序只是为了测试自己,帮助我更熟悉它的内部工作。 它应该做的是等待用户按下开始按钮,然后迭代显示(白色或黑色JPanel网格),以1秒的间隔显示一个简单的细胞自动机模拟,并在按下暂停按钮时暂停(与开始按钮相同,但更改名称)。网格中的每个单元格都应该以随机颜色(白色/黑色)开始。它所做的是暂停半秒左右

  • 我是一个java新手,我正在使用netbean创建一个调度程序。我的软件将从用户那里获取时间和操作,并将这些数据输入到单独的数组列表中。然后我使用javax.swing.timer启动倒计时计时器。当用户完成输入数据并点击“运行”按钮时,计时器将从数组列表中的第一个元素中获取运行时间并开始倒计时。当倒计时时间达到0时,计时器将从数组列表中的下一个元素中获取倒计时时间,依此类推。 我的问题是,计时器