Foros del Web » Programando para Internet » Javascript »

SetTimeout me pierde presicion?

Estas en el tema de SetTimeout me pierde presicion? en el foro de Javascript en Foros del Web. Buenas tardes, soy nuevo en el foro, quisiera saber si me pueden ayudar, estoy tratando de hacer unos cronometros con javascript, utilizo la funcion SetTimeout, ...
  #1 (permalink)  
Antiguo 18/10/2012, 16:31
 
Fecha de Ingreso: octubre-2012
Ubicación: El Salvador
Mensajes: 8
Antigüedad: 12 años, 1 mes
Puntos: 0
Mensaje SetTimeout me pierde presicion?

Buenas tardes, soy nuevo en el foro, quisiera saber si me pueden ayudar, estoy tratando de hacer unos cronometros con javascript, utilizo la funcion SetTimeout, pero el problema es q cuando pongo a correr el cronometro, cuando ha transcurrido una hora, como que pierde presicion, inicie el cronometro que he hecho y otro de un celular, y con el de la pc al mismo tiempo y cuando vengo a ver, me ha perdido como 2 minutos al lapso de una hora, no se a que se debe, les pongo algo del codigo para ver si me pueden ayudar... Gracias
El cronometro muestra, horas,minutos y segundos, me base en uno que vi en la web...

this.decimas++ ;
if ( this.segundos > 59 )
{
this.segundos = 0;
this.minutos++ ;
if ( this.minutos > 59 )
{
this.minutos = 0;
this.horas++ ;
if ( this.horas > 99 )
{
alert('Fin de la cuenta');
this.stop_crono() ;
return true ;
}
}
}


//configura la salida
var ValorCrono = "" ;
ValorCrono = (this.horas < 10) ? "0" + this.horas : this.horas ;
ValorCrono += (this.minutos < 10) ? ":0" + this.minutos : ":" + this.minutos ;
ValorCrono += ":" + this.segundos ;

document.crono.display.value = ValorCrono ;
this.CronoID = setTimeout("microno.mostrar_crono()", 1000);
this.CronoEjecutandose = true ;
return true;
  #2 (permalink)  
Antiguo 18/10/2012, 17:16
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 4 meses
Puntos: 1567
Respuesta: SetTimeout me pierde presicion?

En primer lugar, bienvenido a FDW @edhack7
La script no la analicé, pero te comento que con javascript obtenés la hora del dispositivo del cliente. es decir que se usa el reloj interno de cada uno y puede haber diferencias (hay relojes que atrasan y otros que adelantan, se entiende), aunque 2 minutos en una hora es como demasiado.
Sincronizá la hora de ambos y al cabo de un par de horas fijate si muestran la misma


Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #3 (permalink)  
Antiguo 18/10/2012, 18:49
 
Fecha de Ingreso: octubre-2012
Ubicación: El Salvador
Mensajes: 8
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: SetTimeout me pierde presicion?

Gracias, la verdad soy algo nuevo en programacion en entorno web, y poco se de javascript, me podrias orientar o brindarme un ejemplo de como sincronizar el reloj interno. Se agradece
  #4 (permalink)  
Antiguo 18/10/2012, 18:54
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 4 meses
Puntos: 1567
Respuesta: SetTimeout me pierde presicion?

Cita:
Iniciado por edhack7 Ver Mensaje
Gracias, la verdad soy algo nuevo en programacion en entorno web, y poco se de javascript, me podrias orientar o brindarme un ejemplo de como sincronizar el reloj interno. Se agradece
Es muy simple, los ponés en hora a los dos manualmente (no utilices ninguna aplicación, ya que si usan distintos servers, puede que no coincidan).
Si el reloj anda mal, no hay forma de corregirlo, pero asi al menos te podés dar cuenta si hay algún desfasaje
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 18/10/2012, 19:04
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: SetTimeout me pierde presicion?

El setTimeout o el SetInterval no son exactos. Depende del tiempo de procesador que les de el navegador, mejoran o empeoran. Si minimizas el navegador, o cambias de pestaña, se ralentizan mucho. No te puedes fiar de ellos para hacer un cronómetro exacto.

Para aproximarse a la exactitud, puedes hacer lo siguiente:

var tiempo=(new Date()).getTime();

Eso te da el numero de milisegundos transcurridos desde el 1 de enero de 1970.
Luego, en cada llamada del timeout a tu funcion, en la primera linea haz:

http://jsfiddle.net/marlanga/Uq4YN/

Así, en el peor de los casos, el cronómetro se ha retrasado 500 milisegundos (es decir, el tiempo que le pongamos al timeout). Si quieres mas precision, ponle menos tiempo. Sin embargo, consumirá mas CPU (y en un teléfono móvil eso supone consumir antes la batería).
  #6 (permalink)  
Antiguo 18/10/2012, 19:04
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 6 meses
Puntos: 343
Respuesta: SetTimeout me pierde presicion?

Es imposible tener precisión absoluta con los timers de JavaScript por la manera en la que funcionan.

Lectura recomendada: http://ejohn.org/blog/how-javascript-timers-work/
__________________
blog | @aijoona
  #7 (permalink)  
Antiguo 18/10/2012, 19:18
 
Fecha de Ingreso: octubre-2012
Ubicación: El Salvador
Mensajes: 8
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: SetTimeout me pierde presicion?

Cita:
Iniciado por marlanga Ver Mensaje
El setTimeout o el SetInterval no son exactos. Depende del tiempo de procesador que les de el navegador, mejoran o empeoran. Si minimizas el navegador, o cambias de pestaña, se ralentizan mucho. No te puedes fiar de ellos para hacer un cronómetro exacto.

Para aproximarse a la exactitud, puedes hacer lo siguiente:

var tiempo=(new Date()).getTime();

Eso te da el numero de milisegundos transcurridos desde el 1 de enero de 1970.
Luego, en cada llamada del timeout a tu funcion, en la primera linea haz:

[url]http://jsfiddle.net/marlanga/Uq4YN/[/url]

Así, en el peor de los casos, el cronómetro se ha retrasado 500 milisegundos (es decir, el tiempo que le pongamos al timeout). Si quieres mas precision, ponle menos tiempo. Sin embargo, consumirá mas CPU (y en un teléfono móvil eso supone consumir antes la batería).
Voy a probar lo que me dices, gracias por la info

Etiquetas: cronometro, settimeout
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:07.