Italian count down mangia un secondo

tmtube73

Active Member
Licensed User
qualcuno mi sa dire perchè il seguente codice che fa un countdown da 5 minuti fino a 0 parte sempre da 04:58

B4X:
Sub tmrCD1_Tick
    Dim t As Long = Max(0, targetTime - DateTime.Now)
    If t > 0 Then
        Dim  hours, minutes, seconds As Int
        hours = t / DateTime.TicksPerHour
        minutes = (t Mod DateTime.TicksPerHour) / DateTime.TicksPerMinute
        seconds = (t Mod DateTime.TicksPerMinute) / DateTime.TicksPerSecond
        Log($"$2.0{hours}:$2.0{minutes}:$2.0{seconds}"$)
        LabelCD.Text=($"$2.0{hours}:$2.0{minutes}:$2.0{seconds}"$)
    Else
        Label1.Visible =False
        Label2.Visible =False
        LabelCD.Visible =False
        palla.Visible =False
    End If
End Sub


B4X:
Sub StartTimer (Hours As Int, Minutes As Int)
    targetTime = DateTime.Now + Hours * DateTime.TicksPerHour + Minutes * DateTime.TicksPerMinute
    tmrCD.Enabled = True
End Sub


Avvio il countdown così

B4X:
StartTimer(0,5)
 

Star-Dust

Expert
Licensed User
Longtime User
Forse è 4:58:9999 ?

Prova cosi per vedere i millesimi.
B4X:
Log($"$2.0{hours}:$2.0{minutes}:$2.0{seconds} ${(t mod 1000)}"$)

poi servirebbe sapere qual'è l'intervallo impostato nel timer, perchè magari è li il problema.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Devi fare partire il timer così:
B4X:
Sub StartTimer (Hours As Int, Minutes As Int)
    targetTime = DateTime.Now + Hours * DateTime.TicksPerHour + Minutes * DateTime.TicksPerMinute
    tmrCD1_Tick()
    tmrCD.Enabled = True
End Sub

in questo modo dovresti vedere scritto "5:00" o almeno "04:59", poichè, come diceva StarDust, potrebbe esserci un problema di arrotondamento, dato che dalla lettura del primo tick alla lettura del secondo tick comunque passa del tempo
 

tmtube73

Active Member
Licensed User
Devi fare partire il timer così:
B4X:
Sub StartTimer (Hours As Int, Minutes As Int)
    targetTime = DateTime.Now + Hours * DateTime.TicksPerHour + Minutes * DateTime.TicksPerMinute
    tmrCD1_Tick()
    tmrCD.Enabled = True
End Sub

in questo modo dovresti vedere scritto "5:00" o almeno "04:59", poichè, come diceva StarDust, potrebbe esserci un problema di arrotondamento, dato che dalla lettura del primo tick alla lettura del secondo tick comunque passa del tempo
ho provato scrive 05:00 e dopo 04:58
 

tmtube73

Active Member
Licensed User
Forse è 4:58:9999 ?

Prova cosi per vedere i millesimi.
B4X:
Log($"$2.0{hours}:$2.0{minutes}:$2.0{seconds} ${(t mod 1000)}"$)

poi servirebbe sapere qual'è l'intervallo impostato nel timer, perchè magari è li il problema.
i valori che scrive con la tua riga log(...) sono

00:05:00
00:05:00 0
00:04:58
00:04:58 991
00:04:57
00:04:57 991
00:04:56
00:04:56 990
00:04:55
00:04:55 989
00:04:54
00:04:54 988
00:04:53
00:04:53 988
00:04:52
00:04:52 986
 

Star-Dust

Expert
Licensed User
Longtime User
Adesso ho capito meglio, nel conto alla rovescia.
Tieni conto che le istruzioni consumano frazioni di secondi. Ipotizza che le istruzioni consumano 4ms

quindi quando visualizza 5.00, subito dopo consuma 4ms per eseguire le istruzioni che seguono. quindi in realtà sono 4,59, 996
poi passa un secondo e richiama il tik ed è già 4,58,992 (che comunque qui vedo 991, quindi si mangia 4,5 ms)

Prova cambiando questa riga in
B4X:
 Dim t As Long = round(Max(0, targetTime - DateTime.Now)/1000)*1000
cosi che se la differenza sono millesimi li elimina
 
Last edited:

tmtube73

Active Member
Licensed User
Adesso ho capito meglio, nel conto alla rovescia.
Tieni conto che le istruzioni consumano frazioni di secondi. Ipotizza che le istruzioni consumano 4ms

quindi quando visualizza 5.00, subito dopo consuma 20ms per eseguire le istruzioni che seguono. quindi in realtà sono 4,59, 996
poi passa un secondo e richiama il tik ed è già 4,58,992 (che comunque qui vedo 991, quindi si mangia 4,5 ms)

Prova cambiando questa riga in
B4X:
 Dim t As Long = round(Max(0, targetTime - DateTime.Now)/1000)*1000
cosi che se la differenza sono millesimi li elimina
ho provato, così è perfetto grazie.
 
Top