Исключение Java Thread.sleep - PullRequest
       7

Исключение Java Thread.sleep

1 голос
/ 26 ноября 2010

Я создал класс, который контролирует скорость, с которой работает моя программа, вроде вертикальной синхронизации, и она передает необходимую информацию программе в каждом кадре.У меня все работает, но я попытался использовать более точный Thread.sleep (long millis, int nanos), который я довольно неопытен.Основываясь на описаниях, которые я видел, он просто добавляет предоставленные миллисекунды к наносекундам, а затем останавливает поток.Но около 90% кадров выдают странное исключение, которое я действительно не могу расшифровать.

java.lang.IllegalArgumentException: nanosecond timeout value out of range

Ниже приводится большая часть кода, который я использовал, который каким-либо образом взаимодействует с переменной, которую я использую для задержкискорость потока.

long startTime = System.nanoTime();
while (! this.stop)
{
    try
    {
        // Run Frame

        long endTime, deltaTime, deltaRemainder;
        endTime = System.nanoTime();
        deltaTime = endTime - startTime;

        deltaRemainder = this.rate - (deltaTime % this.rate);
        System.out.println("Frame Completed with "
                + (double)(deltaRemainder * .000000001) + " seconds left!");
        if (deltaRemainder > 0)
            Thread.sleep(0, (int)(deltaRemainder));

        startTime = System.nanoTime();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

- это переменная, равная длине кадра в наносекундах, остановка действительно не важна и очевидна.start / endTime - это время в начале и конце кадра.deltaTime - время, которое фрейм занял до конца.И, наконец, deltaRemainder - это количество дополнительного времени, которое фрейм должен был завершить (если это занимает больше времени, чем должно, он переходит к концу в следующем возможном фрейме).

Может кто-нибудь объяснить, почему это исключениеброшен?Я действительно предпочел бы использовать точность, которую обеспечивает эта функция.

Ответы [ 2 ]

7 голосов
/ 26 ноября 2010

Похоже, что ваш deltaRemainder находится за пределами допустимого диапазона в диапазоне от 0 до 999999.

Из документации Thread.sleep:

  • миллис - продолжительность сна в миллисекундах,
  • nanos - 0-999999 дополнительных наносекунд для сна.

Таким образом, вы должны проверить, больше ли оно 999999, и если это так, поместить значение выше 999999 в миллисекунды, например

int milliseconds = 0;
if ( deltaRemainder > 999999 ) {
     milliseconds = deltaRemainder / 1000000;
     deltaRemainder = deltaRemainder % 1000000;
}

if ( milliseocnds > 0 || deltaRemainder > 0) {
   Thread.sleep(milliseconds, deltaRemainder);
}

Редактировать: Мой пример кода должен рассматриваться как "код поздней ночи", в нем есть ошибки;).

0 голосов
/ 26 ноября 2010

Только предположение:

Интенты имеют 32 бита, поэтому они идут от -2 ^ 31 до 2 ^ 31-1 Если deltaRemainder слишком велик, он может переполниться, и полученное значение int будет отрицательным. Может ли ваш deltaRemainder превысить 2 ^ 31? (2 ГБ, что составляет около 2.000.000.000, это: 2 секунды?)

Другое предположение:

deltaRemainder> 0, но <1. Таким образом, значение int'ed равно 0. </p>

...