2015-11-27 2 views
1

Вот моя проблема. Я работал над тем, чтобы программа рассчитывала на следующий год за считанные секунды или минуты (от минут до 1 десятичной точки, без секунд), и я получаю эту проблему, когда обратный отсчет немного не синхронизирован с системным временем. Это не так уж и много, всего около полутора секунд, но лично это меня очень сильно задевает. Я заметил это, когда просто посмотрел на часы на своем компьютере и, конечно же, добавил System.out.println() звонок для вывода номера на обратный отсчет и фактическое время. Вот мой код:Обработка: цифры, которые должны быть синхронизированы, не являются

import java.util.Calendar; 
import java.util.GregorianCalendar; 

Calendar currentTime; 
Calendar newYear; 
int nextYear; 
boolean isFullScreen = false; 
boolean minutes = false; 

void settings() { 
    if(isFullScreen) { 
    fullScreen(); 
    } else { 
    size(500, 250); 
    } 
} 
void setup() { 
    frameRate(60); 
} 
void draw() { 
    background(255, 0, 0); 
    currentTime = Calendar.getInstance(); 
    nextYear = currentTime.get(Calendar.YEAR) + 1; 
    newYear = new GregorianCalendar(nextYear, 1, 1, 0, 0, 0); 
    textAlign(CENTER, CENTER); 
    fill(0); 
    if(isFullScreen) { 
    textSize(200); 
    } else { 
    textSize(50); 
    } 
    long timeInMillis = currentTime.getTimeInMillis(); 
    long newYearInMillis = newYear.getTimeInMillis(); 
    if(minutes) { 
    text(String.valueOf((float)ceil((float)(newYearInMillis - timeInMillis)/6000)/10), width/2, height/2); 
    } else { 
    System.out.println(String.valueOf(ceil((float)(newYearInMillis - timeInMillis)/1000)) + ", " + currentTime.get(Calendar.SECOND)); 
    text(String.valueOf(ceil((float)(newYearInMillis - timeInMillis)/1000)), width/2, height/2); 
    } 
} 
void mouseClicked() { 
    minutes = !minutes; 
} 

Я получаю вывод, что не имеет смысла:

5666570, 10 
5666570, 10 
5666570, 10 
5666570, 10 
5666570, 10 
5666570, 10 
5666570, 10 
5666570, 10 
5666570, 10 
5666570, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 10 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 
5666569, 11 

Обратите внимание, как отсчет времени думает, что должен отсчитывать 28 кадров до фактического времени. Хотя это и не громоздко, этого достаточно, чтобы быть не только заметным, но и приводить гайки, пытаясь понять, в чем проблема.

ответ

0

Во-первых, не полагайтесь на System.out.println() для выбора времени. Это намного медленнее, чем другие выходные данные, поэтому нормальные условия для операторов печати отстают от экранного времени.

Это, как говорится, программа делает именно то, что вы говорите, чтобы сделать это - округление времени до до следующей секунды. Вот почему ваше экранное время кажется на полсекунды впереди реального времени.

Просто прекратить использование функции ceil(), и ваше время будет синхронизировать довольно тесно с системным временем:

text(String.valueOf((newYearInMillis - timeInMillis)/1000), width/2, height/2); 

Кроме того, я не уверен, что все ваши логики правильно. Например, GregorianCalendar месяца основаны на нуле, поэтому январь должен быть 0, а не 1.

+0

Моя логика использования функции 'ceil()' заключалась в том, что она должна измениться с 2 на 1, когда оставшееся время равно 1.00. Я думаю, что простой способ исправить это было бы просто добавить 1 к числу, переданному в 'String.valueOf()', так что «text (String.valueOf ((newYearInMillis - timeInMillis)/1000 + 1), width/2 , height/2); 'но это кажется не очень хорошим способом исправить это, на мой взгляд. Есть лучший способ сделать это? –

+0

@JustinBarker Добавление 1 не гарантируется, потому что вы не можете точно гарантировать, когда ваш код попал. Подумайте о том, что вы хотите, когда у вас осталось ровно 1.0 секунды, а если у вас осталось 999 мс. Честно говоря, если бы я был вами, я бы отказался от времени в миллисе и просто использовал встроенные функции времени обработки. –

+0

Причина, по которой я не хочу использовать встроенные функции Proessing, заключается в том, что мне придется программировать месячные длины, високосные годы и т. Д. –

Смежные вопросы