20. februar 2006 - 12:46Der 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?
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.
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?
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.
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)?
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.
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) }
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.
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.