setInterval

  • Creatore Discussione Creatore Discussione gerrix
  • Data di inizio Data di inizio

gerrix

Nuovo Utente
24 Feb 2013
7
0
0
www.gerrix.it
Ciao a tutti è il mio primo post:

Dovrei realizzare un display che inizi da un ora da me scelta (tipo Smpte) ad esempio 01:01:01:000 ed avanzi incrementando millisecondi,secondi, minuti e ore. Ho iniziato a sperimentare la funzione setInterval ma ho notato che anche se imposto l'intervallo a 1 quando faccio partire il conteggio in realtà per arrivare a 1000 ci mette molto più di un secondo (forse 3 o 4) ed ho notato che se clicco un altra volta(mentre è gia stata avviata) sul pulsante che avvia la funzione la velocità aumenta notevolmente e, ancora di più, se clicco più volte ci mette molto di meno di un secondo a finire il ciclo dei 1000 millesecondi.(molto probabilmente ne salta parecchi :) )
domanda:

Ma è normale che questa semplice funzione (vedi sotto) per contare un millisecondo (un counter che conta fino a 1000 ci metta anche 3 -4 secondi?
Codice:
<script>
var tempo = 0;
function myFunction()
{
setInterval(function(){
tempo ++;
 document.getElementById('smptemilliDiv').innerHTML=tempo;
},1);
}
</script>

è un limite di js o c'è qualcosa che non ho capito od ignoro?

Grazie mille per l'attenzione e a chiedo scusa se ho fatto una domanda banale :)

Gerrix
 
Credo che sia una cosa dovuta allo stesso javascript, comunque io ho risolto cosi
Codice:
var volte = 0;
var mils=0;
function myFunction()
{
setInterval(function(){
mils = new Date().getMilliseconds();
document.getElementById('smptemilliDiv').innerHTML=mils+(volte*1000);
if(mils>995)volte++;
},1);
}
//alcune volte fa degli sbalzi vedi se riesci a migliorarlo
 
Ultima modifica:
Niente da fare:crying:
purtroppo salta e anche tanto a volte di 4 a volte di 5 fino ad arrivare anche a 14.
Volevo realizzare una sorta di metronomo con varie suddivisioni ma ho bisogno di una estrema precisione. Vabbe, pazienza. Grazie cmq.
Gerrix
 
Ciao,

usa due metodi Date

poi sottrai il getTime() di una dall'altra e conti in millisecondi.


Codice:
<script type="text/javascript">
var data = new Date();
function timer() {
setTimeout("timer()", 1);
var now = new Date();
millisecondi = now.getTime() - data.getTime();
document.getElementById('smptemilliDiv').innerHTML= millisecondi;
if (millisecondi >= 60000){
document.getElementById('smptemilliDiv').innerHTML= "1 Minuto";
}
}
onload=timer;
</script>
</head>
<body>

<div id="smptemilliDiv"></div>

Valeria.
 
Ciao Valeria e grazie di tutto,

Si certo 1 minuto lo esegue nel tempo esatto ma i millisecondi non crescono uno + uno fino a mille ma fanno salti come ti ho mostrato nell'immagine allegata alla mia risposta. purtroppo questo non mi permette di calibrare in modo esatto quello mi serve

Voglio realizzare un metronomo con divisioni e sottodivisioni. Un metronomo misura i battiti per minuto ad esempio se imposto il metronomo a 90 significa che esattamente in un minuto compie 90 battiti regolari della stessa misura (questo lo ottengo abbastanza correttamente) ma se a questi io voglio potere assegnare una divisione x2 (duine) x3 (terzine) x 4 quartine etc etc. per esempio nel caso delle quartine per ogni battito regolare a 90 io devo far emettere altri 3 battiti regolari in un solo movimento e quindi sarebbero (90x4) 360 battiti regolari in un minuto la cosa si presenta quasi impraticabile o addirittura impossibile, figuriamoci se poi vorrei addirittura arrivare a sestine o altro. Il nodo sta proprio li... Cmq se provi a stampare la sequenza che arriva a mille potrai notare anche tu che non sono regolari, a me servirebbe quello per fare fare calcoli precisi in millisecondi.

Grazie ancora
Gerrix
 
Ciao Valeria e grazie di tutto,

Si certo 1 minuto lo esegue nel tempo esatto ma i millisecondi non crescono uno + uno fino a mille ma fanno salti come ti ho mostrato nell'immagine allegata alla mia risposta. purtroppo questo non mi permette di calibrare in modo esatto quello mi serve

Voglio realizzare un metronomo con divisioni e sottodivisioni. Un metronomo misura i battiti per minuto ad esempio se imposto il metronomo a 90 significa che esattamente in un minuto compie 90 battiti regolari della stessa misura (questo lo ottengo abbastanza correttamente) ma se a questi io voglio potere assegnare una divisione x2 (duine) x3 (terzine) x 4 quartine etc etc. per esempio nel caso delle quartine per ogni battito regolare a 90 io devo far emettere altri 3 battiti regolari in un solo movimento e quindi sarebbero (90x4) 360 battiti regolari in un minuto la cosa si presenta quasi impraticabile o addirittura impossibile, figuriamoci se poi vorrei addirittura arrivare a sestine o altro. Il nodo sta proprio li... Cmq se provi a stampare la sequenza che arriva a mille potrai notare anche tu che non sono regolari, a me servirebbe quello per fare fare calcoli precisi in millisecondi.

Grazie ancora
Gerrix

Ciao,

non so cosa sono le duine terzire quartine sestine ecc.....

l'unità di misura per un secondo in javascript viene calcolata in millesimi di secondo 1000 = 1 secondo.

L'esempio che ho fatto in un secondo ti mostra 999 millesimi al 1000 aggiunde 1, poi prosegue all'infinito a meno che come nell'esempio che ho fatto, quando arrivi a 1 minuto 60000 millisecondi fermati.

Considera che deve scrivere e stampare a video 999 numeri in un secondo decimi, centesimi e millesimi 001 002 -> 010 011 -> 100 -> 999 -> 1000 (un secondo), è impossibile vederli scorrere a video, ma il calcolo è esatto.

Tu hai postato una immagine con una sequenza di numeri in verticale. Posta il codice che hai utilizzato.

Valeria.
 
Ciao,

non so cosa sono le duine terzire quartine sestine ecc.....

l'unità di misura per un secondo in javascript viene calcolata in millesimi di secondo 1000 = 1 secondo.

L'esempio che ho fatto in un secondo ti mostra 999 millesimi al 1000 aggiunde 1, poi prosegue all'infinito a meno che come nell'esempio che ho fatto, quando arrivi a 1 minuto 60000 millisecondi fermati.

Considera che deve scrivere e stampare a video 999 numeri in un secondo decimi, centesimi e millesimi 001 002 -> 010 011 -> 100 -> 999 -> 1000 (un secondo), è impossibile vederli scorrere a video, ma il calcolo è esatto.

Tu hai postato una immagine con una sequenza di numeri in verticale. Posta il codice che hai utilizzato.

Valeria.

I timer di javascript sono inaffidabili se c'è di mezzo il tempo, perché il tempismo con il quale viene richiamata la funzione dell'intervallo non è garantita.
Javascript esegue tutti gli eventi del browser asincronamente in un unico thread, quindi significa che qualsiasi cosa può aumentare il delay con il quale un intervallo di un timer viene eseguito: spostamento del mouse, pressione di un tasto, posizionamento di un div, insomma tutto.

In pratica l'esecuzione della funzione viene messa in coda a tutte le operazioni che devono essere eseguite prima, quindi è possibile che dopo una prima chiamata effettuata ad 1 millisecondo, la seconda avvenga a 20 millisecondi o a 5 millisecondi... appunto non è garantito.
Ed è per questo che, calcolando la differenza tra tempo di inizio e tempo di fine e, stampando a schermo tutti i risultati ( come si vede nell'immagine postata da gerrix ), vengano saltati alcuni millisecondi. In realtà i millisecondi non saltano per qualche salto di funzione di javascript, ma perché appunto la funzione viene richiamata più tardi del dovuto... quindi avremo una cosa del genere: 1234ms - 1200ms. L'immagine postata da gerrix dimostra appunto questo gap di js.

Per riprodurre un metronomo c'è bisogno di precisione al millesimo, altrimenti ( sopratutto nelle suddivisioni piu piccole ) si rischia, basandosi sulla differenza dei millisecondi ottenti dal Date, di saltare dei click. L'unica soluzione è usare un numero progressivo che incrementa insieme al setInterval, così sì ha la certezza di non perdere nessun "millisecondo". Anche se in questo caso il problema si trasforma in una poca affidabilità dei battiti suonati dal metronomo. Perché dato lo stesso problema di delay di javascript, un suono potrebbe anticiparsi come ritardare.

Dando un occhiata a questo schema si può capire piu o meno come funziona l'esecuzione dei timer di js:
http://ejohn.org/files/Timers.png
 
Ultima modifica:
Grazie Lwyrn per l'esauriente spiegazione, ora posso, purtroppo, definitivamente rassegnarmi :mad: .

Grazie anche a te Vale2, cmq quei numeri stampati in verticale sono stati generati dall'esempio che mi hai postato. L'ho modificato leggermente facendo finire a 10 secondi e stampare in orizzontale, come puoi vedere, purtroppo, se aggiorni, ogni volta che arriva a 10 secondi, oltre a saltare il conteggio dei millesecondi la rappresentazione non è mai simile.

http://gerrix.it/smpte9.html

Ciao
Gerrix
 
Grazie Lwyrn per l'esauriente spiegazione, ora posso, purtroppo, definitivamente rassegnarmi :mad: .

Grazie anche a te Vale2, cmq quei numeri stampati in verticale sono stati generati dall'esempio che mi hai postato. L'ho modificato leggermente facendo finire a 10 secondi e stampare in orizzontale, come puoi vedere, purtroppo, se aggiorni, ogni volta che arriva a 10 secondi, oltre a saltare il conteggio dei millesecondi la rappresentazione non è mai simile.

http://gerrix.it/smpte9.html

Ciao
Gerrix

Correzione :) Sono 6 i secondi in realtà avevo scritto 10
Gerrix