# Timer



## gbunge (4. Jan 2017)

Hallo,
für eine Echtzeit-Simulation brauche ich einen Taktgeber von 50 ms.

Timer timer = new Timer( 50, timeout );
Beim Ablauf der Simulation habe ich festgestellt, dass ich doppelt so viele Durchläufe hatte als
erwartet. Bedeutet das, dass der Timer-Event in Java in der angegebenen Zeit zweimal auftritt?
Gruss GBunge


----------



## Cromewell (4. Jan 2017)

Welche Klasse Timer ist denn das, die als Parameter delay und timeout aufnimmt?


----------



## VfL_Freak (5. Jan 2017)

Moin,

die Frage von @Cromewell ist sehr berechtigt! Einen Timer mit Angabe eines TimesOuts kenne ich auch nicht! 
Wozu sollte das Timeout denn gut sein?? Einen Timerdurchlauf vorzeitig abbrechen ???

Normal wäre sowas:


> *
> 
> 
> javax.swing.Timer.Timer(int delay, ActionListener listener)*
> ...


http://openbook.rheinwerk-verlag.de...14_007.htm#mj4145d5f8cf91e93d1d41e573c3d11ccc



gbunge hat gesagt.:


> dass ich doppelt so viele Durchläufe hatte als erwartet


Aha - und woran machst Du das fest?
Poste mal den gesamten relevanten Code!

Gruß Klaus


----------



## gbunge (5. Jan 2017)

Hallo Klaus,
ok, der Post war missverständlich! Der Parameter 'timeout' meint natürlich den ActionListener.
Also hier vollständiger Code:

```
ActionListener timeout = new ActionListener()
      { @Override public void actionPerformed(ActionEvent evt)
        { count++; }
      };
      timer = new Timer( 50, timeout );
      timer.start();
```
Die Simulation eine Minute laufen lassen und dann den Counter ausgeben.
Der hat den Wert 2400. Erwartet habe ich 1200.
Gruß Günter


----------



## VfL_Freak (5. Jan 2017)

hmm, sieht auf den ersten Blick mal ok aus 
Wie stellst Du die Minute Laufzeit sicher?
Und nochmal die Frage, welche Timerklasse verwendest Du (welchen Import) ??
Gruß Klaus


----------



## mrBrown (5. Jan 2017)

gbunge hat gesagt.:


> Der hat den Wert 2400. Erwartet habe ich 1200.


nicht eher 120/240?



VfL_Freak hat gesagt.:


> Und nochmal die Frage, welche Timerklasse verwendest Du (welchen Import) ??


Das sieht doch sehr nach javax.swing.Timer aus



gbunge hat gesagt.:


> Bedeutet das, dass der Timer-Event in Java in der angegebenen Zeit zweimal auftritt?


Nein, eher ein Fehler deinerseits.
Wenn ich raten müsste, würde ich doppelt erstellter Timer sagen

Brauchst du den Timer für die GUI?


----------



## VfL_Freak (5. Jan 2017)

Moin,



mrBrown hat gesagt.:


> nicht eher 120/240?


Warum ?? 

1 Minute Laufzeit = 60 Sekunden = 60000 Millisekunden
geteilt durch 50 sollte es doch 1200 ergeben, oder nicht ??

Gruß Klaus


----------



## mrBrown (5. Jan 2017)

VfL_Freak hat gesagt.:


> Warum ??
> 
> 1 Minute Laufzeit = 60 Sekunden = 60000 Millisekunden
> geteilt durch 50 sollte es doch 1200 ergeben, oder nicht ??


Oh, klar, Brett vor'm Kopf -.-


----------



## gbunge (5. Jan 2017)

Hallo Klaus,
1. der Timer ist der 'javax.swing.Timer'
2. Laufzeit einfach auf der Uhr den Sekundenzeiger beachten, es kommt mir ja nicht auf den exakten   Wert,  sondern nur auf die Größenordnung an.
3. Es gibt nur einmal einen Timer, instanziiert im Kontruktor.
4. für das Gui brauche ich den ActinListener auch, allerdings glaube ich, daß das  auf den Timer keinen Einfluß hat. In der Messzeit bentze ich das Gui nicht, also auch keine Reaktion auf einen anderen Event.
Günter


----------



## mrBrown (5. Jan 2017)

Der ActionListener wird zumindest vom Timer nicht doppelt aufgerufen. Wenn da was schief läuft, liegt das am restlichen Code



gbunge hat gesagt.:


> 4. für das Gui brauche ich den ActinListener auch, allerdings glaube ich, daß das auf den Timer keinen Einfluß hat. In der Messzeit bentze ich das Gui nicht, also auch keine Reaktion auf einen anderen Event.


"den ActionListener" meint aber nicht den gleichen, oder?


----------



## Viktim (6. Jan 2017)

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

import javax.swing.Timer;

public class TEST {
  static int count = 0;

  public static void main(String[] args) throws InterruptedException {

    long time = System.currentTimeMillis();

    ActionListener timeout = new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent evt) {
        count++;

        if (System.currentTimeMillis() - time >= 60000) {
          System.out.println(count);
          System.exit(0);
        }
      }
    };
    Timer timer = new Timer(50, timeout);
    timer.start();
   Thread.sleep(70000);

  }

}
```
also, wenn ich das hier so ausführe, dann kommt da als Ausgabe: 1190
Das passt also....

Das heißt es *MUSS *daran liegen, dass du irgendwas doppelt machst!


----------



## gbunge (6. Jan 2017)

Hallo mrBrown,
deine Frage verstehe ich nicht ganz. 
Wenn ich in einer GUI z.B. 4 Buttons anordne, die natürlich verschiedene Aktionen auslösen sollen, dann benutze ich doch einen ActinListener und ordne den Buttons verschiedene ActionCommands zu, die ich dann in der überschriebenen Methode 'actionPerformed'
dekodiere um die verschiedenen Aktionen auszulösen.
Ich benutze also einen ActionListener für verschiedene Events. Also könnte ich auch den Timerevent in dieser Methode abfangen und verarbeiten.
Ist das falsch? Oder was bedeutet Deine Frage?
Gruß Günter


----------



## gbunge (6. Jan 2017)

Hallo Viktim_,_
_wenn ich Deinen TEST laufenlasse, dann ist das Ergebnis richtig. 
Offensichtlich passiert bei mir noch etwas zusätzlich. Ich bin gerade dabei meinen Code daraufhin zu prüfen.
Was ich nicht verstehe ist die Zeile_
*'Thread.sleep( 70000 );'*
_Welcher Thread soll da schlafen?
Wenn ich die Zeile auskommentiere läuft der TEST auch richtig.
Gruß Günter_


----------



## Viktim (9. Jan 2017)

gbunge hat gesagt.:


> _Was ich nicht verstehe ist die Zeile_
> *'Thread.sleep( 70000 );'*


Das ist einfach, damit das Programm lange genug läuft, um die 6 sekunden Hochzähldauer rumzukriegen 

EDIT: Hats bei mir gebraucht, ist aber gut, wenn dus nicht brauchst


----------

