Вот моя проблема. Я работал над тем, чтобы программа рассчитывала на следующий год за считанные секунды или минуты (от минут до 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 кадров до фактического времени. Хотя это и не громоздко, этого достаточно, чтобы быть не только заметным, но и приводить гайки, пытаясь понять, в чем проблема.
Моя логика использования функции 'ceil()' заключалась в том, что она должна измениться с 2 на 1, когда оставшееся время равно 1.00. Я думаю, что простой способ исправить это было бы просто добавить 1 к числу, переданному в 'String.valueOf()', так что «text (String.valueOf ((newYearInMillis - timeInMillis)/1000 + 1), width/2 , height/2); 'но это кажется не очень хорошим способом исправить это, на мой взгляд. Есть лучший способ сделать это? –
@JustinBarker Добавление 1 не гарантируется, потому что вы не можете точно гарантировать, когда ваш код попал. Подумайте о том, что вы хотите, когда у вас осталось ровно 1.0 секунды, а если у вас осталось 999 мс. Честно говоря, если бы я был вами, я бы отказался от времени в миллисе и просто использовал встроенные функции времени обработки. –
Причина, по которой я не хочу использовать встроенные функции Proessing, заключается в том, что мне придется программировать месячные длины, високосные годы и т. Д. –