Newsgroup: it.comp.lang.visual-basic
Titolo: Timer o non Timer?

Chiedo aiuto.
Per creare un Cronometro che parta da 0 e va avanti anche a 10 e
passa ore; cosa devo fare....quale codice?
serve il timer1.time o no?
Vorrei anche che i secondi ecc.. si potessero visualizzare in un label.
Grazie 1000000000:-)
Rispondetemi qui!
sol...@freemail.it

Si, potrebbe bastare un timer, ma di devi basare sull'ora di sistema (Ovvero Ora cronometrata= Ora Attuale - Ora di
Inizio):
Mi spiego meglio:
- Converti l'ora d'inizio in Secondi
- Ogni volta che si verifica l'evento Timer1_Timer converti l'ora attuale in secondi
- Sottrai OraAttuale - OraD'Inizio
- Riconverti il tisultato in Ore Minuti Secondi
Esempio:
Aggiungi alla Form una Label ("Label1") un controllo Timer ("Timer1") ed un pulsante d'avvio ("Command1")
Incolla il codice seguente nella sezione Dichiarazioni del Form
Public SecondiAvvio, SecondiAttuali
Private Sub Command1_Click()
    SecondiAvvio = CDbl(Hour(Now)) * 3600 + CDbl(Minute(Now)) * 60 + CDbl(Second(Now))	'Converte l'ora iniziale in
seciondi
    Timer1.Interval = 300		'Imposta l'intervallo del Timer
End Sub
Private Sub Timer1_Timer()
    SecondiAttuali = CDbl(Hour(Now)) * 3600 + CDbl(Minute(Now)) * 60 + CDbl(Second(Now))		'Converte l'ora
attuale in secondi
    secondi = SecondiAttuali - SecondiAvvio	'Calcola la differenza
    Label1.Caption = Format(secondi \ 3600, "00") & ":" & Format(CInt((secondi Mod 3600) \ 60), "00") & ":" &
Format(CInt((secondi Mod 3600) Mod 60), "00")	'Scrive l'ora nella Label (puoi usare anche tre label separate, basta
isolare le tre funzioni Format
End Sub
Spero di esserti stato d'aiuto....
Problema, se lasci il cronometro troppo a lungo attivo, si profila il problema dei giorni, quindi devi applicare delle
modifiche al codice.....
Ciao,
#sirri#@
tin.it
(togliete "#" dall'indirizzo)

...
Ma non è più facile fare:
Timer1.interval = 60000 'un minuto, ma è indifferente, basta che sia >0
MyInterval = 36000000 '10 ore
Sub Timer1_Timer()
    Static Giro as Long 'La prima volta è inizializzato a 0
    Giro = Giro +1
    if  Giro * Timer1.interval < MyInterval then Exit Sub
    Giro = 0
    [...Codice da eseguire ogni 10 ore...]
End Sub
Ciao




Già, peccato che l'intervallo del Timer non è settabile a più di 65535......



Il Timer e' l'ultima cosa che viene eseguita dal SO (prima del repaint).
Se il SO e' occupato con altri TASK il Timer non viene richiamato, se non
appena possibile.
Su grandi distanze, usando dei contatori come fai tu, vi e' un grosso
accumulo di errore. Su 10 ore l'errore
puo' essere di diversi minuti.
Quindi conviene testare periodicamente l'ora di sistema, e limitare l'errore
alla frequenza del test.
Ciao
By -MES-   Maronese Ettore
http://ilmes.freeweb.org
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://members.xoom.com/it_lang_vb

alla frequenza del test.
Ok, allora facciamo cosě:
Timer1.interval = 1000 'un secondo č un margine d'errore abbastanza piccolo?
Sub Timer1_Timer()
    Static Start as long
    if  (GetTickCount() - Start < 10 * 3600) then Exit Sub
    Start = GetTickCount()
    [...Codice da eseguire ogni 10 ore...]
End Sub
E' ancora piů semplice e piů funzionale.
Comunque, effettivamente il concetto č quello utilizzato da Moreno Silli.
Mi castigo da solo?
Ciao.

Mi castigo da solo?
Scusa se infierisco ancora... :-))
GetTickCount() e' meglio non usarlo in questi casi, o va usato in modo un po
diverso, inquanto se un PC rimane acceso per (se ricordo bene) 47 giorni (su
per giu') , il valore di GetTickCount() si resetta, e va tutto a pallino.
Succo succo, il metodo di Moreno Silli e' quello giusto :-))
SALUTONI
