Problemi con cronometro

di il
7 risposte

Problemi con cronometro

Ciao a tutti, sono alle prime armi con javascript e mi stavo cimentando nella creazione di un cronometro con il seguente codice:

        function start() {
            if(Stop == true) {
                Stop = false;
                setTimeout(() => {
                    cronometroMin()
                }, 1000);
            };
        };
        function cronometroMin() {
            if(Stop == false) {
                Minuti++;
                if(Minuti > 59) {
                    Ore++
                    Minuti = 0;
                }
                mostra();
                setTimeout(() => {
                    cronometroMin()
                }, 1000);
            }
        };
        function mostra() {
            if (Ore<1) {
                Vis = "00:";                
            } else if (Ore > 0 && Ore<10) {
                Vis = "0"+Ore+":";
            } else {
                Vis = Ore+":";
            };
            if (Minuti<1) {
                Vis = Vis +"00";                
            } else if (Minuti > 0 && Minuti<10) {
                Vis = Vis +"0"+Minuti;
            } else {
                Vis = Vis +Minuti;
            };
            document.getElementById("vis").innerHTML = Vis;
        }; 

funziona correttamente però per testarlo l'ho confrontato con il cronometro del telefono e pur partendo in contemporanea più avanza e più aumenta la differenza tra i due cronometri (con il mio di javascript un pochino più lento)
Spero che qualcuno possa aiutarmi
Grazie

7 Risposte

  • Re: Problemi con cronometro

    Posta tutto il codice e la dichiarazione delle variabili..... cosi posso provarlo
  • Re: Problemi con cronometro

    Il problema concettuale e' pensare che un timeout di 1000 millisecondi sia di ESATTAMENTE 1000 millisecondi, ed il tempo di esecuzione dello script sia di ESATTAMENTE 0 millisecondi.

    Ovviamente non e' cosi': ci sono n-mila cose che rendono tali valori 'piu' o meno circa':
    il timeout non e' di 1000 millisecondi, ma un po' di piu', ed il tempo di esecuzione del codice non e' di 0 millisecondi, ma di piu'

    L'unico oggetto che mantiene il tempo in modo corretto, anche perche' si riallinea con una certa regolarita' con gli orologi atomici sparsi in giro per il mondo, e' l'orologio di sistema.

    Quindi, quello che devi fare e' usare l'orologio di sistema per ottenere i seguenti valori

    1) a che ora e' iniziata l'esecuzione corrente
    2) che ore sono un'attimo prima di finire
    3) che ore dovranno essere a 1000 millisecondi dopo l'ora di inizio
    4) quanti millisecondi mancano dall'oa corrente alla prossima esecuzione
    5) fare una sleep dei millisecondi che mancano
    6) ogni tanto ricontrollare di essere 'in orario' e correggere di conseguenza
  • Re: Problemi con cronometro

    migliorabile ha scritto:


    Il problema concettuale e' pensare che un timeout di 1000 millisecondi sia di ESATTAMENTE 1000 millisecondi, ed il tempo di esecuzione dello script sia di ESATTAMENTE 0 millisecondi. [...]
    Concordo con tutto quanto è stato detto, e aggiungo che oltre a setTimeout esisterebbe anche la funzione setInterval, senz'altro più adatta allo scopo, fermo restando che la schedulazione di codice dovrebbe essere finalizzata tutt'al più all'aggiornamento della visualizzazione.

    Per sapere il tempo trascorso bisogna fare riferimento all'orologio di sistema, e non contare i secondi con uno strumento così impreciso e suscettibile come i "timer".

    E anzi, l'intervallo temporale dovrebbe avere un tempo più basso del secondo, se l'interfaccia deve essere aggiornata in modo che sembri in tempo reale.

    Ciao!
  • Re: Problemi con cronometro

    Scusatemi se rispondo solo ora ma proprio in questi giorni sto riprendendo in mano il progetto in questione.
    Innanzitutto vi ringrazio delle risposte, però vorrei chiedervi ulteriori delucidazioni.
    Ho capito che usando il timeout il conteggio non è del tutto preciso.
    Nel mio programma ho il pulsante di avvio e il pulsante di stop del timer, è ovvio che se mi memorizzo l’orario di start e quello di stop posso avere il conteggio di minuti/secondi trascorsi tra i due orari però se volessi mostrare all’utente il tempo che scorre come posso fare ?
    Scusatemi ma sono alle prime armi
  • Re: Problemi con cronometro

    edo92 ha scritto:


    se volessi mostrare all’utente il tempo che scorre come posso fare ?
    Ti basta mettere un elemento nella pagina, anche un semplice <div>, dandogli un identificativo tipo
    
    <div id="time"></div>
    
    e poi via JavaScript recuperare un riferimento all'oggetto del DOM che rappresenta quell'elemento, e scriverci dentro il valore:
    
    document.getElementById("time").innerText = elapsedTime;
    
    Ciao!
  • Re: Problemi con cronometro

    Elapsedtime è una funzione ? Da quello che ho capito cercando un po’ online riporta la differenza tra due orari, è corretto ?
    Se fosse così come faccio a mostrare un cronometro dinamico ?
  • Re: Problemi con cronometro

    edo92 ha scritto:


    Elapsedtime è una funzione ?
    No, è il nome della variabile che contiene il tempo trascorso, che ho usato come esempio (un banale segnaposto) all'interno dell'esempio di codice. Quel valore ovviamente dovrai calcolarlo.

    edo92 ha scritto:


    Se fosse così come faccio a mostrare un cronometro dinamico ?
    Devi combinare il calcolo con l'uso di setInterval() o setTimeout() per ripetere periodicamente l'operazione.

    Ad ogni modo, mi sembra una funzionalità abbastanza banale da riprodurre: vedi ad esempio questo articolo che spiega praticamente tutto (l'ho trovato con una ricerca su Google, sempre la prima cosa da fare).

    Ciao!
Devi accedere o registrarti per scrivere nel forum
7 risposte