timerzeit

silson

Aktives Mitglied
Hallo,
warum läuft der timer nicht genau.
public final static int SHOW_TIME_PER_SLIDE = 1000
der hängt bei 1 min fast 1 sek hinterher...
haber jetzt 992 eingestellt und da läuft er bei 20min ca. 1s falsch...
stelle ich aber 991 ein, läuft er bei 20 min auch 1s falsch...
mein wert müsste irgendwie dazwischen liegen...
aber denke mal die 1000 sind richtig und ich habe irgendwas falsch gemacht, oder
 
Y

yfons123

Gast
code formatieren kannst du in der chat box links oben mit dem </> knopf

wo ist der rest...
 

MarvinsDepression

Bekanntes Mitglied
Ich tippe ja auf eine Taktsteuerung mittels Thread.sleep(), denn die "Timer"-Funktionen sind schon recht genau.
Wenn dem so ist, dann überlege Dir mal, wie Da ein Fehler mit der Zeit kumuliert: Der Code macht etwas, dann schläft der Thread genau eine Sekunde, dann macht er wieder was und schläft anschließend wieder genau eine Sekunde. Was gerne übersehen wird, ist der Fakt, dass Einschlafen, Aufwachen und auch der restliche Code ebenfalls Zeit benötigen. Je nach dem kommt da schon was zusammen.
 

KonradN

Super-Moderator
Mitarbeiter
Habe den timer über Bilder laufen vielleicht deshalb...
Was für einen Timer nutzt Du genau wie? Es gibt nicht den Timer! Alleine im JDK findet sich direkt:
java.util.Timer
javax.swing.Timer
javax.management.timer.Timer

Daher: Immer genau sagen, was Du machst. Also Code in vernünftigen Auszügen zeigen. Oder - wenn man es optimal machen will - ein minimales, kleines Beispiel erzeugen, das die Problematik aufzeigt.
 

silson

Aktives Mitglied
Das ist der Code zu dem Programm...
also bei slide = 992 kommt es fast hin...
Java:
package pack;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

public class Startseite{
    
    public final static int SHOW_TIME_PER_SLIDE = 992;
    
     Timer timer = new Timer(SHOW_TIME_PER_SLIDE, new StartHaendler());
    
    JFrame jf = new JFrame();
    
    JButton play = new JButton("start");
    
    
    
    JLabel bild6 = new JLabel();
    ImageIcon timerZahlMinuteZehnerstelle = new ImageIcon("bilder/timerzahl2.png");
    
    JLabel bild7 = new JLabel();
    ImageIcon timerZahlMinuteEinerstelle = new ImageIcon("bilder/timerzahl0.png");
    
    JLabel bild8 = new JLabel();
    ImageIcon timerZahlSekundeZehnerstelle = new ImageIcon("bilder/timerzahl0.png");
    
    JLabel bild9 = new JLabel();
    ImageIcon timerZahlSekundeEinerstelle = new ImageIcon("bilder/timerzahl0.png");
    
    JLabel bild10 = new JLabel();
    ImageIcon timerDoppelpunkt = new ImageIcon("bilder/doppelpunkt.png");
    

    
    public static void main(String[] args) {
        
        new Startseite();
    }
    
    
    public Startseite() {
        
        jf.setTitle("BlindTimer");
        jf.setSize(1920, 1080);
        jf.getContentPane().setBackground(Color.BLACK);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLayout(null);
        jf.setResizable(true);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
        
        
        
        bild6.setIcon(timerZahlMinuteZehnerstelle);
        bild6.setBounds(625, 440, 133, 200);
        jf.add(bild6);
        
        bild7.setIcon(timerZahlMinuteEinerstelle);
        bild7.setBounds(778, 440, 133, 200);
        jf.add(bild7);
        
        bild8.setIcon(timerZahlSekundeZehnerstelle);
        bild8.setBounds(1008, 440, 133, 200);
        jf.add(bild8);
        
        bild9.setIcon(timerZahlSekundeEinerstelle);
        bild9.setBounds(1161, 440, 133, 200);
        jf.add(bild9);
        
        bild10.setIcon(timerDoppelpunkt);
        bild10.setBounds(941, 490, 37, 100);
        jf.add(bild10);
        
        
        
        play.setIcon(null);
        play.setBounds(910, 700, 100, 50);
        play.addActionListener(new StartHaendler());
        jf.add(play);   
    }
    
    
    class StartHaendler implements ActionListener{
        
        int timerZifferSekundeEinerstelle = 0;
        int timerZifferSekundeZehnerstelle = 0;
        int timerZifferMinuteEinerstelle = 0;
        int timerZifferMinuteZehnerstelle = 2;
        

        @Override
        public void actionPerformed(ActionEvent e) {
            
            if(e.getSource()== play) {
                timer.start();
            }
            
            timerZifferSekundeEinerstelle = timerZifferSekundeEinerstelle-1;
            
            if(timerZifferSekundeEinerstelle == -1) {
                timerZifferSekundeEinerstelle = 9;
            }
            
            if(timerZifferSekundeEinerstelle == 9) {
                timerZifferSekundeZehnerstelle = timerZifferSekundeZehnerstelle -1;
            }
            
            if(timerZifferSekundeEinerstelle == 9 && timerZifferSekundeZehnerstelle == -1) {
                timerZifferSekundeZehnerstelle = 5;
                timerZifferMinuteEinerstelle = timerZifferMinuteEinerstelle -1;
            }
            
            if(timerZifferSekundeEinerstelle == 9 && timerZifferSekundeZehnerstelle == 5 && timerZifferMinuteEinerstelle == -1) {
                timerZifferSekundeZehnerstelle = 5;
                timerZifferMinuteEinerstelle = 9;
                timerZifferMinuteZehnerstelle = timerZifferMinuteZehnerstelle -1;
            }
            
        
            bild6.setIcon(new ImageIcon("bilder/timerzahl" + timerZifferMinuteZehnerstelle + ".png"));
            
            bild7.setIcon(new ImageIcon("bilder/timerzahl" + timerZifferMinuteEinerstelle + ".png"));
            
            bild8.setIcon(new ImageIcon("bilder/timerzahl" + timerZifferSekundeZehnerstelle + ".png"));
            
            bild9.setIcon(new ImageIcon("bilder/timerzahl" + timerZifferSekundeEinerstelle + ".png"));
        }
    }
}
 

MarvinsDepression

Bekanntes Mitglied
Wenn dir der Timer nicht genau genug ist, könntest du etl. den hier verwenden.

Java:
import java.util.Timer;
import java.util.TimerTask;

public class TimerDemo {
    
    public static void main() {
        Timer timer = new Timer();
        TimerTask task = new MyTimerTaskClass();
        
        timer.scheduleAtFixedRate(task, 0, 1000); // läuft exakt
        
        ... // solange der Timer laufen soll
        
        timer.cancel();
        timer.purge();
    }
}

class MyTimerTaskClass extends TimerTask {
    
    public void run() { ... } // hier dein Code
}
ggf. bietet der swing.timer aber auch was ähnliches.
 

Robert Zenz

Top Contributor
Ich habe jetzt nicht alles genau gelesen...

Freundliche Erinnerung das "exakt" auf einem Nicht-Echtzeit-Betriebssystem relativ ist, weil man keinerlei Garantien bekommt. Wenn die CPU gerade durch etwas anderes verwendet wird, hat man einfach Pech. Waehrend ziemlich alle modernen Betriebssysteme relativ genau sind und gute Scheduler haben, gibt es ein paar davon hustwindowshust die unter verschiedenen Lasten (zum Beispiel Lesen/Schreiben) alles andere hinten anstellen und man sich wundert wieso alles vor sich hin kriecht.
 

Neue Themen


Oben