Newsgroup: it.comp.lang.visual-basic
Titolo: Domandone: come funziona il controllo timer?

Salve a tutti!
Eccomi qua. Mi stavo chiedendo come funziona un controllo timer.
E sapete perchč? Allora, pochi giorni fa ho chiesto come fare
 a non bloccare il pc (io creavo un ciclo con alcuni doevents, ma
la percentuale di utilizzo della cpu (con monitor di sistema si vede) era
sempre al massimo. Allora mi avete consigliato di mettere un controllo
timer. bene. ho meso un controllo timer con interval=1 (i millisecondo
circa no?) e l'utilizzo cpu non arriva neanche al 5%.)
Io mi chieso come sia possibile che il controllo timer pur eseguendo
migliaia di volte lo stesso codice al secondo non occupi neanche un pochino
la cpu. Forse č perchč un ciclo lo ripete mooolte piů volte.. ma io vorrei
sapere
come funziona il controllo timer, magari posso anche farne a meno..
sapete qualcosa?
grazie a tutti!
ciao, Augusto

 circa no?) e l'utilizzo cpu non arriva neanche al 5%.)
Interval 1 non significa che sicuramente il timer scatti ogni millisecondo,
ma solo che scatta appena č possibile se č passato almeno 1 millisecondo e
Windows non ha niente altro da fare.
Il Timer tick č sicuramente valido solo per multipli di 1/18 di secondo. Per
intervalli piů brevi bisogna usare un multimedia-timer, altrimenti non hai
la certezza che vengano soddisfatte le richieste.
Se non ti fidi fai una prova. Nell'evento Timer1_Timer inserisci questo
codice:
Private Sub Timer1_Timer()
    Debug.Print Timer
End Sub
Poi interrompi, dai una occhiata nella finestra di immediate, e guarda che
intervallo c'č tra una chiamata e l'altra.
Ciao
*Roby*

> circa no?) e l'utilizzo cpu non arriva neanche al 5%.)
RP> Interval 1 non significa che sicuramente il timer scatti ogni millisecondo,
RP> ma solo che scatta appena è possibile se è passato almeno 1 millisecondo e
RP> Windows non ha niente altro da fare.
Dovrei ricontrollare, ma mi sembra  che il problema stia non su quando
parte il timer che è abbastanza regolare (salvo architetture Win9x con
codice a  16 bit eseguito nel ring  0... *puke!*) ma su  quando la tua
applicazione  ha  tempo  di  considerare  i messaggi  del  timer  (bit
QS_TIMER nella parola controllata al  risveglio) che sono i messaggi a
priorità più bassa...
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: 
sa...@eng.it
 ( vedere X-nospam nello header - see X-nospam in header )

 come funziona il controllo timer, magari posso anche farne a meno..
Dei timer il 95% delle volte si può farne a meno, e sarebbe meglio.
Comunque non credere che windows stia in loop per ogni timer che viene
attivato nel sistema, altrimenti il PC si incendierebbe, oltre a bloccarsi
:)
Quando un timer si attiva viene lanciato un WM_TIMER nello scheduler di
sistema, windows non fa _niente_ nel frattempo (niente DoEvents quindi che
dovrebbero essere banditi dal linguaggio perchè portano solo disgrazie,
almeno nel 99% dei casi).
Quando è arrivato il momento windows esegue il codice associato a quel
WM_TIMER.
Tecnicamente credo che windows faccia qualcosa del genere:
    Sub DoTimer(Byvel dwMilliseconds as long)
        Sleep(dwMilliseconds)
        Call YourTimerProcedure()
    End Sub
Mentre il tuo timer di VB fa questo:
    Sub Timer_OnEnabling()
        Loop
            Windows.DoTimer(Timer.Interval)
        While (Timer.Enabled) And (Timer.Interval > 0)
    End Sub
Windows.DoTimer() non blocca tutto perchè è eseguito in un trhead separato.
(Ogni riferimento a nomi e procedure è puramente casuale :))
Comunque la precisione del timer di VB non scende sotto i 50ms, anche se
metti 1, sempre che nel frattempo VB non stia facendo altro.
Per questo è anche buona norma disabilitare il timer all'entrata della sub
_Timer e riabilitarlo all'uscita: così eviti che ti si accavallino eventi
timer, in particolare se usi i DoEvents.
Ciao

Zanna, hai scritto (fra parentesi):
"niente DoEvents quindi che
dovrebbero essere banditi dal linguaggio perchè portano solo disgrazie,
almeno nel 99% dei casi"
dovevi scriverlo a LETTERE CUBITALI!
Mamma mia, quanto hai ragione!