Timer

gbunge

Aktives Mitglied
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
 

VfL_Freak

Top Contributor
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 ???:rolleyes:

Normal wäre sowas:

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

Creates a Timer and initializes both the initial delay and between-event delay to delay milliseconds. If delay is less than or equal to zero, the timer fires as soon as it is started. If listener is not null, it's registered as an action listener on the timer.
Parameters:
delay milliseconds for the initial and between-event delay
listener an initial listener; can be null
http://openbook.rheinwerk-verlag.de...14_007.htm#mj4145d5f8cf91e93d1d41e573c3d11ccc

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

Aktives Mitglied
Hallo Klaus,
ok, der Post war missverständlich! Der Parameter 'timeout' meint natürlich den ActionListener.
Also hier vollständiger Code:
Java:
 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

Top Contributor
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

Super-Moderator
Mitarbeiter
Der hat den Wert 2400. Erwartet habe ich 1200.
nicht eher 120/240?

Und nochmal die Frage, welche Timerklasse verwendest Du (welchen Import) ??
Das sieht doch sehr nach javax.swing.Timer aus

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?
 

gbunge

Aktives Mitglied
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

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

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

Bekanntes Mitglied
Java:
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

Aktives Mitglied
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

Aktives Mitglied
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
 

Ähnliche Java Themen

Neue Themen


Oben