Почему мои часы не работают идеально?

В настоящее время я работаю над часами в java, используя класс StandardPen. Кажется, все работает правильно, за исключением того, что когда я дойду до 6-10 минут во время работы программы, часы начинают глючить. Ошибка, кажется, возникла сразу после того, как я добавил часовую стрелку. Причина, по которой часовая стрелка отличается от кода секундной и минутной стрелок, заключается в том, что thread.sleep (20) не может работать со скоростью часовой стрелки. Кто-нибудь, пожалуйста, помогите мне это быстро исправить, пожалуйста

import java.awt.Color;
import TurtleGraphics.StandardPen;

public class Clock_Final {
    public static void main(String[] args) {

        StandardPen pen = new StandardPen();

        double num=90, num1 = 90, num3 = 90, loop = 1, minute = 90, minuteclear = 90, cont = 0, cont2 = 0, tick1 = 90, hour = 90, hourclear = 90, hourcount = 0, hourcount1 = 0;
        String three = "3", six = "6", nine = "9", twelve = "12", signature = "Created by: Me";

        pen.setColor(Color.black);
        pen.up();
        pen.setDirection(270);
        pen.move(350);
        pen.setDirection(180);
        pen.move(60);
        pen.drawString(signature);
        pen.down();
        pen.home();
//twelve
        pen.setColor(Color.black);
        pen.up();
        pen.setDirection(90);
        pen.move(280);
        pen.setDirection(180);
        pen.move(7);
        pen.down();
        pen.drawString(twelve);
        pen.home();
//three
        pen.up();
        pen.setDirection(0);
        pen.move(278);
        pen.setDirection(270);
        pen.move(5);
        pen.down();
        pen.drawString(three);
        pen.home();

//six                        
        pen.up();
        pen.setDirection(270);
        pen.move(290);
        pen.setDirection(180);
        pen.move(3);
        pen.down();
        pen.drawString(six);
        pen.home();

//nine
        pen.up();
        pen.setDirection(180);
        pen.move(285);
        pen.setDirection(270);
        pen.move(5);
        pen.down();
        pen.drawString(nine);
        pen.home();
//_-_-_outside of the clock (the circle)
        for (cont = 0; cont < 360; cont++) {
            pen.setColor(Color.black);
            pen.setDirection(num);
            pen.setWidth(8);
            pen.up();
            pen.move(270);
            pen.down();
            pen.move(2);
            pen.home();
            num--;

            if (num==0) {
                num = 360;
            }
        }
     //tick start
        for (cont2=0;cont2<60;cont2++) {
            pen.setColor(Color.gray);

            pen.setDirection(tick1);
            pen.setWidth(3);
            pen.up();
//method for minute/second ticks (start)
            if (tick1 == 0 || tick1 == 30 || tick1 == 60 || tick1 == 90 || tick1 == 120 || tick1 == 150 || tick1 == 180 || tick1 == 210 || tick1 == 240 || tick1 == 270 || tick1 == 300 || tick1 == 330) {
                if (tick1 == 0 || tick1 == 90 || tick1 == 180 || tick1 == 270) {
                    pen.setColor(Color.black);
                    pen.setWidth(5);
                    pen.move(225);
                    pen.down();
                    pen.move(39);
                    pen.setColor(Color.gray);
                } else {
                    pen.setColor(Color.darkGray);
                    pen.move(230);
                    pen.down();
                    pen.move(34);
                    pen.setColor(Color.gray);
                }
            } //method for minute ticks (end)
            else if (tick1 != 0 || tick1 != 30 || tick1 != 60 || tick1 != 90 || tick1 != 120 || tick1 != 150 || tick1 != 180 || tick1 != 210 || tick1 != 240 || tick1 != 270 || tick1 != 300 || tick1 != 330) {
                pen.move(250);
                pen.down();
                pen.move(14);
            }
            pen.home();
            if (tick1 == 0) {
                tick1 = 360;
            }
            tick1 = tick1 - 6;
        }
        while (loop == 1) {
        pen.setWidth(2);
        //draw new second hand
                pen.setColor(Color.red);
                pen.setDirection(num1);
                pen.move(220);

                if (num1 < .05) {
                    num1 = 360;
                }
                num1 -= .3;

        //draw new minute hand 
                pen.home();
                pen.setColor(Color.darkGray);
                pen.setDirection(minute);
                pen.move(200);

                if (minute == 1) {
                    minute = 360;
                }
                minute -= .005;

        //draw new hour hand 
                pen.home();
                pen.setColor(Color.darkGray);
                pen.setDirection(hour);
                pen.move(160);

                if (hour == 0) {
                    hour = 360;
                }
                hourcount+=.05;
                if (hourcount % 360 == 0) {
                    hour -= 1;
                }

                //sleep
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

    //clear old second hand
                pen.home();
                pen.setColor(Color.white);
                pen.setDirection(num3);
                pen.move(220);

                if (num3 < .05) {
                    num3 = 360;
                }
                num3 -= .3;

                pen.home();

    //clear old minute hand
                pen.home();
                pen.setColor(Color.white);
                pen.setDirection(minuteclear);
                pen.move(200);

                if (minuteclear == 0) {
                    minuteclear = 360;
                }
                minuteclear -= .005;

                pen.home();

    //clear old hour hand
                pen.home();
                pen.setColor(Color.white);
                pen.setDirection(hourclear);
                pen.move(160);

                if (hourclear == 0) {
                    hourclear = 360;
                }
                hourcount1+=.05;
                if (hourcount1 % 360 == 0) {
                    hourclear -= 1;
                }

                pen.home();

        }
    }
}

person new2java    schedule 12.01.2014    source источник


Ответы (1)


Я полагаю, вы имеете в виду под "сбой" вы имеете в виду потерю времени? Проблема с использованием sleep () для управления вашими часами заключается в том, что вы никогда не знаете, сколько времени они проспали, и рисование ваших часов также требует времени. небольшие временные ошибки будут накапливаться со временем. Кроме того, многозадачность и планирование потоков означает, что вы никогда не знаете, сколько времени на самом деле прошло. вы по-прежнему можете использовать sleep (), чтобы решить, когда рисовать часы, но вам нужно «получить» фактическое время и нарисовать часы на его основе. См .: new Date () и GregorianCalendar ()

Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(new Date()); // current time
int mins = calendar.get(Calendar.MINUTE);
// etc..

Вот создатель часов, который я написал, который использует этот метод ...

https://code.google.com/p/catchpole/source/browse/trunk/catchpole-fuse/src/main/java/net/catchpole/awt/ClockFaceRenderer.java

person slipperyseal    schedule 12.01.2014
comment
К вашему сведению, неприятные старые классы даты и времени, такие как java.util.Date , java.util.Calendar и java.text.SimpleDateFormat теперь являются устаревшими, замененными java.time классы, встроенные в Java 8 и Java 9. См. Руководство Oracle. - person Basil Bourque; 08.02.2018
comment
ну, я опубликовал этот ответ в январе 2014 года - person slipperyseal; 08.02.2018
comment
Мой комментарий - это не критика, а просто заметка для сегодняшних читателей. - person Basil Bourque; 08.02.2018
comment
@BasilBourque извините, что вы правы. мне, наверное, не нужно было писать этот комментарий. спасибо за заметку :) как время летит (шутка GregorianCalendar) - person slipperyseal; 09.02.2018