Timer.scheduleAtFixedRate().

Status
Nicht offen für weitere Antworten.

Campino

Top Contributor
hi,

ich habe eine Uhr programmiert, die regelmäßig ihre anzeige an die Systemzeit anpasst. Dabei startet ein Timer einen TimerTask, der die Systemzeit ausließt und anzeigt. Das ganze braucht 97% meiner CPU-Leistung, wo seht ihr die Performance-Killer? Haltet ihr es für sinnvoller, die Zeit einmal auszulesen und dann bei jedem TimerTask-Aufruf eine Variable hochzuzählen? Oder wie würdet ihr das machen?
 

Illuvatar

Top Contributor
Wie oft rufst du den TimerTask denn auf? wenn das so schnell wie möglich hintereinander geschiet, ist das ja klar, dann ist das ja kaum was anderes als ne while(true) Schleife.

Mach lieber nen Thread (oder auch TimerTask), der alle sagen wir 25 millisekunden repaint() aufruft. Und die Zeit ausllesen machst du am besten dann in der paint-Methode, weil dann wird die Zeit genau so oft ausgelesen, wie das auch benötigt wird.
 

Sky

Top Contributor
Campino hat gesagt.:
die regelmäßig ihre anzeige an die Systemzeit anpasst.
Wie oft wird angepaßt?

Campino hat gesagt.:
Dabei startet ein Timer einen TimerTask, der die Systemzeit ausließt und anzeigt.
Wie und wo wird angezeigt?

Illuvatar hat gesagt.:
Mach lieber nen Thread (oder auch TimerTask), der alle sagen wir 25 millisekunden repaint() aufruft.
TimerTask ist m.E. besser, weil der GUI-Thread dann nicht blockiert ist. TimerTask ist außerdem schon vorhanden. Alle 25 ms lesen ist zu oft, für eine Uhr, die sekundengenau geht. @Campino: Geht doch sekundengenau, oder ?

Illuvatar hat gesagt.:
Und die Zeit ausllesen machst du am besten dann in der paint-Methode, weil dann wird die Zeit genau so oft ausgelesen, wie das auch benötigt wird.
Falsch. Dann wird die Zeit ausgelesen, wenn neu gemalt wird, was durchaus auch mehr als sagen wir einmal in der Sekunde sein kann.
Man könnte evtl. einen ComponentListener verwenden, um den Timer anzuhalten/zu starten, wenn die Uhr nicht sichtbar ist/aufgeschaltet wird.
 

Illuvatar

Top Contributor
Sky hat gesagt.:
Campino hat gesagt.:
Dabei startet ein Timer einen TimerTask, der die Systemzeit ausließt und anzeigt.
Wie und wo wird angezeigt?
Illuvatar hat gesagt.:
Mach lieber nen Thread (oder auch TimerTask), der alle sagen wir 25 millisekunden repaint() aufruft.
TimerTask ist m.E. besser, weil der GUI-Thread dann nicht blockiert ist. TimerTask ist außerdem schon vorhanden. Alle 25 ms lesen ist zu oft, für eine Uhr, die sekundengenau geht. @Campino: Geht doch sekundengenau, oder ?

Der wird doch net blockiert :? Aber gut, man könnte nen javax.swing.Timer nehmen, der is sogar explizit mit dem GUI-Thread synchronisiert.

Illuvatar hat gesagt.:
Und die Zeit ausllesen machst du am besten dann in der paint-Methode, weil dann wird die Zeit genau so oft ausgelesen, wie das auch benötigt wird.
Falsch. Dann wird die Zeit ausgelesen, wenn neu gemalt wird, was durchaus auch mehr als sagen wir einmal in der Sekunde sein kann.
Man könnte evtl. einen ComponentListener verwenden, um den Timer anzuhalten/zu starten, wenn die Uhr nicht sichtbar ist/aufgeschaltet wird.

Naja und wie willst dus machen? (Wenn der Timer läuft) Einmal pro Sekunde abfragen? Aber das kann ja dann immer zu spät kommen und is somit ungenau.
Ich meinte: immer wenn gezeichnet wird muss die aktuelle Zeit dasein. Dann ist es so genau wie möglich und dabei wird nur so viel CPU wie nötig verbraucht.
 

Sky

Top Contributor
Illuvatar hat gesagt.:
Naja und wie willst dus machen? (Wenn der Timer läuft) Einmal pro Sekunde abfragen?
Einmal pro Sekunde ist natürlich zu wenig. 100,200,500 ms sind aber in Ordnung.

Illuvatar hat gesagt.:
Ich meinte: immer wenn gezeichnet wird muss die aktuelle Zeit dasein.
Dann sind wir durchaus gleicher Meinung.

Illuvatar hat gesagt.:
Dann ist es so genau wie möglich und dabei wird nur so viel CPU wie nötig verbraucht.
Prinzipiell auch hier Zustimmung. Nur kann es passieren, das paint mehr als einmal pro Sekunde aufgerufen wird. Da muss man nicht unbedingt jedes mal die Zeit auslesen (wie gesagt: alle 100/200/500 ms).
 

Campino

Top Contributor
Also:
die uhr ist sogar nur Minutengenau. Derzeit rufe ich den TimerTask alle 30000ms auf (also alle halbe Minute) dann setze ich die Zeit als Text eines JMenu und rufe validate() auf.

EDIT: Problem gelöst. ich hatte das ganze erst als Thread und hab dann beim Umwandeln in TimerTask die while(true) Schleife drinngelassen, statt alle 30000ms die zeit zu aktualisieren wurde alle 30000ms eine neue Endlosschleife gestartet, die die Zeit aktualisierte. :oops:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Timer terminiert nicht Allgemeine Java-Themen 5
W Timer Konzept-Frage Allgemeine Java-Themen 16
Z Timer Allgemeine Java-Themen 5
H Timer funktioniert nicht? Allgemeine Java-Themen 3
Tacofan Kurzer Timer Allgemeine Java-Themen 22
B Threads Timer wird immer schneller Allgemeine Java-Themen 6
H Consumer (Java8 Lambda) an Timer übergeben Allgemeine Java-Themen 2
wolfgang63 Best Practice Taktgeber oder Timer mit variablem Intervall Allgemeine Java-Themen 1
I Timer Allgemeine Java-Themen 1
X Timer Allgemeine Java-Themen 3
C Timer? Allgemeine Java-Themen 8
U Timer - Timertask endet nicht Allgemeine Java-Themen 4
X timer.schedule - Allgemeine Java-Themen 7
D Simpler Timer zum warten Allgemeine Java-Themen 19
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
G Threads Timer wird unterbrochen Allgemeine Java-Themen 20
P Java Timer Allgemeine Java-Themen 3
K Timer Thread Allgemeine Java-Themen 8
E Wie Timer anbringen mit Designer in Netbeans Allgemeine Java-Themen 5
M Ampelsteuerung über Timer in Java realisieren Allgemeine Java-Themen 3
O Timer pausieren Allgemeine Java-Themen 5
M Timer von nicht existiertem Objekt stopen Allgemeine Java-Themen 5
B util.Timer zu langsam? Allgemeine Java-Themen 3
P Java Timer Allgemeine Java-Themen 2
S Timer in Applet? Allgemeine Java-Themen 11
G Swing Timer führt Methode nicht aus Allgemeine Java-Themen 2
V Frage zu util.Timer (-> TimerTask) Allgemeine Java-Themen 2
P Swing Eine Sekunde warten (Timer) Allgemeine Java-Themen 7
E Timer class macht einfach garnichts :/ Allgemeine Java-Themen 6
T Timer oder Alternative? Allgemeine Java-Themen 3
Z Timer -> Thread jeden Tag ausführen Allgemeine Java-Themen 5
D Probleme mit einem Timer Allgemeine Java-Themen 6
E Timer - gleichen Task mehrfach planen Allgemeine Java-Themen 2
D Timer oder Thread, das ist hier die Frage Allgemeine Java-Themen 3
A TimerTask - Task stoppen - timer.cancel() funktioniert nicht Allgemeine Java-Themen 8
S Problem mit einem Timer (Aktualisierung etc.) Allgemeine Java-Themen 2
B Timer übergabe Allgemeine Java-Themen 3
G Timer abbrechen und neu starten Allgemeine Java-Themen 3
G timer mit buttondruck abbrechen Allgemeine Java-Themen 7
T Timer oder ähnliches? Allgemeine Java-Themen 3
O Timer und TimerTask: Programm terminiert nicht! Allgemeine Java-Themen 3
O Thread als Timer Interrupt Allgemeine Java-Themen 2
H gibts in Java sowas wie in Visual Basic den Timer? Allgemeine Java-Themen 5
B 24 Uhr Timer Task Allgemeine Java-Themen 5
G Timer nur 64 mal pro Sekunde? Allgemeine Java-Themen 18
S Frage zu jTDS, JAVA allgemein und Timer Allgemeine Java-Themen 6
L Problem mit Timer Allgemeine Java-Themen 7
J Timer-Objekt / Task-Zustand ermitteln Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben