Avatar billede Slettet bruger
26. marts 2005 - 16:20 Der er 7 kommentarer og
2 løsninger

Udfør opgave hvert sekund (ikke relativt til uret i O/S)

Hej,

Lad os sige, jeg vil lave et ur i Java. Altså nogle tal, der viser tiden. Det skal opdatere hver sekund.

Til det kan man bruge Timer og et TimerTask ala:

timer = new Timer();

timer.scheduleAtFixedRate(new TimerTask(...), 0, 1000);

Problemet er så bare, at sættes computerens ur baglæns, så stopper timeren. For timeren er relativ til computerens ur. Sætter jeg således mit ur i Windows en time tilbage, ja så udføres timeren (run() i TimerTask) ført når der er gået en time. Hvilket jo ikke dur, når man eksempelvis går til vintertid.

En simpel tråd og en sleep er ikke godt nok (da opgaven der udføres tager forskellig tid), og uret således ikke opdateres tæt nok på hvert sekund.

Hvordan løser jeg dette?
Avatar billede arne_v Ekspert
26. marts 2005 - 16:45 #1
Øh.

Hvad version kører du af Windows ?

Normalt så kører computerens UR på GMT og Windows skifter automatisk
offset i forhold til GMT ved skift til/fra vintertid og det bør ikke
påvirke en timer.
Avatar billede Slettet bruger
26. marts 2005 - 16:48 #2
Ok, så gør det nok ikke det. Men problemet er det samme.

Hvis jeg starter mit java_ur.jar ... og så sætter computeren ur 10 minutter tilbage,
så tager det 10 minutter før at timerens run() udføres.

Forstår du hvad jeg mener? (det med vintertid var bare et eksempel, kan godt være det ikke bliver et reelt problem, hvis GMT anvendes som du skriver).
Avatar billede arne_v Ekspert
26. marts 2005 - 16:50 #3
OK

men det er så et vanskeligt problem ...
Avatar billede Slettet bruger
26. marts 2005 - 16:56 #4
Overvejer noget fusk med en anden tråd, der checker om timerens task ikke er blevet udført i lang tid (eksempelvis 5 sekunder), og hvis den ikke er, så nedlægger den gamle timer og opretter en ny. Men altså...
Avatar billede Slettet bruger
26. marts 2005 - 17:00 #5
Eller en anden tråd, der opdager om tiden er gået baglæns, og hvis den er, nedlægger og opretter en ny timer.
Avatar billede Slettet bruger
26. marts 2005 - 20:08 #6
Har du flere kommentarer arne_v ellers tror jeg, jeg lukker?
Avatar billede arne_v Ekspert
26. marts 2005 - 20:37 #7
Jeg tror simpelthen ikke at du kan stille på tiden mens du har en timer kørende
og få noget fornuftigt ud af det.

Det du skal gøre er at justere tiden langsomt.

I stedetfor at lave -10 minutter så laver du:

for(int i = 0; i < nominut*60; i++) {
    // lav -1 sekund
    // sleep 2 sekunder
}
Avatar billede Slettet bruger
30. marts 2005 - 15:13 #8
Det er ikke mig selv, der skal ændre på tiden. Men Windows' ur synkroniserer jo med en tidsserver. Og hvis uret pludesligt stilles tilbage, så skal mit program ikke stoppe med at opdatere uret.

Jeg har implementeret noget fusk, der holder øje med om tiden gør det, og hvis den gør, gendanner timertask.

Hvis du vil have point for din indsats, så læg et svar.
Avatar billede arne_v Ekspert
30. marts 2005 - 16:52 #9
OK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester