Avatar billede kovalt Nybegynder
20. februar 2006 - 12:46 Der er 10 kommentarer og
1 løsning

Stopur taber tid

Hej

  Jeg har et stopur - lavet i noget javascript. Uret fungerer som sådan fint - jeg har dog det problem at uret taber cirka 20 sekunder for hver time der går. Dette dur ikke idet uret skal anvendes til noget tidstagning.

  Er der nogen der har et script som de ved der virker? Spørgsmål er måske endda om jeg griber det forkert an og i stedet burde spørge på systemtiden hver gang jeg poster en tid i min database - ville dette være en bedre løsning?

/Kovalt
Avatar billede ldanielsen Nybegynder
20. februar 2006 - 13:03 #1
Hvis du laver stopuret på den måde at du hvert sekund gør noget og siger "gør det igen om et sekund", så vil uret tabe:

var t = 0

function runClock(){
  t++
  tim = window.setTimeout("runClock()", 1000)
  }
runClock();

Det dur ikke.

Men dette fungerer:

<HTML>
<BODY onload="runClock();">

<P>
<SCRIPT LANGUAGE=javascript>
<!--

var t = 0
var d = new Date()


function runClock(){
  t = new Date() - d;
  document.forms[0].tid.value = Math.floor(t/1000);
  tim = window.setTimeout("runClock()", 100)
  }
 
//-->
</SCRIPT>
</P>
<form><input name="tid" value=""></form>
</BODY>
</HTML>

runClock()


var t = 0
var startTid = Date()
function runClock(){
  t++
  tim = window.setTimeout("runClock()", 1000)
  }
Avatar billede ldanielsen Nybegynder
20. februar 2006 - 13:07 #2
Undskyld, de nederste linier skulle ikke have været med :o) - efter </HTML>


Det den gør er at den registrerer starttiden, d, og så trækker den fra den aktuelle tid. Resultatet kommer ud i millisekunder, så hvis jeg dividerer med 1000 bliver det sekunder.

Jeg har en fejl, for d skal først sættes i funktionen, det skal være sådan:

var t = 0
var d

function runClock(){
  if (d == null) d = new Date()
  t = new Date() - d;
  document.forms[0].tid.value = Math.floor(t/1000);
  tim = window.setTimeout("runClock()", 100)
  }


den kører 10 gange i sekundet, så display'et kan godt "halte" lidt, men forløbet tid passer.
Avatar billede ldanielsen Nybegynder
20. februar 2006 - 13:14 #3
Problemet kan være at det går efter klientens computers systemtid. Så man kan "snyde" ved at stille på uret.

Hvad skal det bruges til? Den sikre måde er jo at gå efter serverens tid, med de begrænsninger det giver:

Brugeren vil starte tiden, så man klikker på en knap der sender beskeden til serveren. Den starter så tiden, men først nogle sekunder senere, når den modtager beskeden, og får tid til at gøre det.

Men vil så stoppe tiden, eller vil vide hvor meget tid der er gået, så man kliker igen på en kanp eller to, og xx sekunder senere hører serveren det. Den sender forløbet tid til klienten, der modtager det xx sekunder senere.

Men hvad skal det kunne klare, ang. præcision og sikkerhed?
Avatar billede kovalt Nybegynder
20. februar 2006 - 13:44 #4
Det skal som sagt bruges til noget tidstagning i forbindelse med nogle motionsløb. TIl conputeren er der koblet 2 USB stregkodelæsere.

Oprindeligt havde jeg lavet det sådan at der - hver gang der kom en tid ind i systemet - blev kørt noget ASP, der smed koden ned i en DB. Dette fungere dog ikke idet der godt kan komme op til 3-4 registreringer pr. sek.. Jeg gik derfor over til at lavet det sådan at registrreingerne bliver opsamlet i en variabel i javaScript, som jeg så poster til DB hvert 15 sekundt. Problemet er som sagt blot at uret taber tid. Dette sker hvadenten jeg poster til DB eller ej. Dog er der kun tale om 4 sekunder pr. time såfremt jeg ikke har nogle data der postes.

Den side som poster mine data ned i databasen ligger naturligvis i en iframe for ikke at uret bliver resat.

/Kovalt
Avatar billede kovalt Nybegynder
20. februar 2006 - 13:45 #5
Kunne en løsning være at request system-tiden på computeren hver gang der kommer en registreret i stedet for at lade noget javaScript tælle tiden op? (eller giver dette det samme)?
Avatar billede ldanielsen Nybegynder
20. februar 2006 - 13:57 #6
Hvis du har én computer der registrer starten, og som derefter registrerer slut og mellemtider, så lyder det som om det er den rigtige løsning at bruge denne computers systemtid. Hvis uret taber tid på den computer, så har du lavet det forkert.

Når tiderne så er registreret, kan du sende dem til serveren, og det er ligegyldigt om du gør det hvert minut eller hver time.
Avatar billede ldanielsen Nybegynder
20. februar 2006 - 13:59 #7
Du skal netop requeste systemtiden hele tiden, for hvis javascript skal tælle, som du siger, kommer det bagefter.

I mit eksempel bliver systemtiden netop konsulteret hele tiden:

<HTML>
<BODY onload="runClock();">

<P>
<SCRIPT LANGUAGE=javascript>
<!--

var t = 0
var d

function runClock(){
  if (d == null) d = new Date()
  t = new Date() - d;
  document.forms[0].tid.value = Math.floor(t/1000);
  tim = window.setTimeout("runClock()", 100)
  }
 
//-->
</SCRIPT>
</P>
<form><input name="tid" value=""></form>
</BODY>
</HTML>
Avatar billede kovalt Nybegynder
20. februar 2006 - 14:21 #8
jamen det vil jeg lige rode lidt med... jeg vender tilbage :-)
Avatar billede ldanielsen Nybegynder
20. februar 2006 - 14:37 #9
Du kan lave det stopur jeg viser til at vise hvad uret står på. Når en tid skal registreres synes jeg ikke nødvendigvis du skal spørge stopuret hvor lang tid der er gået, spørg hellere systemtiden hvad klokken er, og udregn tiden udfra det.
Avatar billede kovalt Nybegynder
20. februar 2006 - 15:33 #10
det virker - smid et svar
Avatar billede ldanielsen Nybegynder
20. februar 2006 - 16:05 #11
Svar :o)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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