【问题标题】:Java Thread getting elapsed time :: how to get small changeJava 线程获得经过的时间 :: 如何获得小的变化
【发布时间】:2013-05-14 09:05:39
【问题描述】:

这是我为线程运行的方法

public void run() {
    float timeElapsed =0;
    while(running){
        time += timeElapsed; // recording time.
        if(timeElapsed != 0 )Log.d(id, "pressed time " + time + " "+ timeElapsed);
/**fromhere :: just how I get fps ratio.
        oneSec += timeElapsed;
        fpsCompound++;
        if(oneSec > 1){
            fpsCompound = 0;
            oneSec = 0;
        }
**/endhere 
        timeBefore = System.nanoTime();
        loopCall(timeElapsed);
        timeElapsed =(System.nanoTime()-timeBefore)/1000000000;
//sometimes my timeElapsed is 0, my guess is because the loopCall does nothing in some cases
        while(timeElapsed < .005){
            timeElapsed =(System.nanoTime()-timeBefore)/1000000000;
        }
    }
}

如果 timeElapsed 小于 0.005,我想摆脱那个延迟循环的 while 循环。

但是,如果我跳过该延迟部分,有时我的 timeElapsed 为 0,即使必须经过一小部分秒。

这些零经过时间的累积结果会导致意外的时间错误。所以如果每个循环太快而无法记录时间,我会延迟我的线程。

这种不必要的延迟似乎很愚蠢。必须有正确的方法来计算时间。

编辑:

似乎将 timeElapsed 除以 1000000000 返回的值太小,我的浮点数无法包含。有没有办法包含这么小的数字?

【问题讨论】:

  • 这听起来像是经典的XY problem。您试图通过已用时间循环解决的真正问题是什么?可能有更好的方法可用。
  • 您正在使用整数除法。它将是 0。
  • 谢谢邓肯琼斯。我刚刚意识到什么是“问题”让我编辑问题。
  • @DuncanJones 这是更新的游戏循环的一部分。我想在 x 时间内隐藏图像,但由于经过的时间太短,我最好使用其他变量而不是浮点数来表示我的 timeElapsed。对于这种时间敏感的代码,我应该只使用其他类型,例如 long 吗?或者,如果时间过得太少而无法在意,延迟是否“可以”。
  • @Stephan:我们的谈话开始变得离题了;)我的例子很糟糕,我假设 OP 帽子float = (long-long)/int。我的例子应该是:float f = (12L-10L)/3; System.out.println(f);

标签: java multithreading time-estimation


【解决方案1】:

我认为您应该将纳秒保持不变,而不是将其转换为浮点秒。

然后你会得到这样的代码: timeElapsed 定义为 long:

            long timeElapsed = 0;

您的循环结束将如下所示:

            timeBefore = System.nanoTime();
            loopCall(timeElapsed);
            timeElapsed =(System.nanoTime()-timeBefore);        
            while(timeElapsed < 5000000){
                timeElapsed = (System.nanoTime()-timeBefore);
            }

我希望这就是你想要的。


我还建议使用 Thread.sleep(long, int); 等待你会失去一些精度(它会休眠几毫秒)但会节省一些 CPU 时间

         /*while(timeElapsed < 5000000){
              timeElapsed = (System.nanoTime()-timeBefore);
           }*/


           long leftToSleep = 5000000 - timeElapsed;
           if(leftToSleep > 0) {
              //dont forget to surround it with try catch
              Thread.sleep(leftToSleep / 1000000, (int) leftToSleep % 1000000);
           }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多