Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6]Il timer mi salta i cicli

Ho sempre pensato che quando qualcosa non funziona, non è la macchina
che fà le bizze, sono io che sbaglio. Ma vi giuro che stasera ho
qualche dubbio. Il programma su cui anche in questo momento stò
lavorando è grosso, ma la parte che mi mette in crisi è la
seguente....semplice semplice:
Private Sub tmrProc_imer()
Select Case Second(Time)
 Case 10
        Call proc_(1)
    Debug.Print "ciclo1"
 Case 20
        Call proc_(2)
    Debug.Print "ciclo2"
 Case 30
        Call proc_scarto_tq(3)
    Debug.Print "ciclo3"
 Case 40
        Call proc_(4)
    End If
    Debug.Print "ciclo4"
 Case 50
        Call proc_(5)
    Debug.Print "ciclo5"
 Case 0 ' che sarebbe 60
        Call proc_(6)
    Debug.Print "ciclo6"
 End Select
L'intervallo è impostato a 900ms. Ogni tanto, non sempre,  mi salta un
ciclo e non entra nella nella proc() e quindi non fà nenache il
debug.print "ciclox". C'è una spiegazione a questo?
Fabio
End Sub

     End If
L'If iniziale c'č?
-- 
Greg 

No quell 'end if non c'entra. Ho modificato il codice per renderlo +
leggibile qui sul newsgroup.
E' incredibile se smaneyyo un pò di + sul prog succede che mi torna
addiritura indietro.
Cioè nella finestra immediata mi ritrovo:
ciclo1
ciclo2
ciclo4
ciclo5
ciclo4
ciclo5
........................................................

 debug.print "ciclox". C'è una spiegazione a questo?
Per esempio che in una delle Proc(X) faccia qualcosa che occupa
più di un tot di tempo: potrebbe non rientrare entro i dieci secondi,
quindi saltare una chiamata.
In più, se ci mette *meno* di un tot, può rientrare più volte nello stesso
secondo, e anche questo potrebbe dare problemi. Per esempio, ho
provato il tuo codice così com'era, solamente remmando le proc(x)
e quell' "end if" spurio, l'ho fatto girare un po' e i risultati sono stati 
questi:
*****************
ciclo6
ciclo1
ciclo2
ciclo3
ciclo4
ciclo5
ciclo6
ciclo1
ciclo2
ciclo3
ciclo4
ciclo5
ciclo6 <---------------
ciclo6 <---------------doppio
ciclo1 <---------------
ciclo1 <---------------doppio
ciclo2 <---------------
ciclo2 <---------------doppio
ciclo3
ciclo4
ciclo5
ciclo6
ciclo1
*****************
Ti sembrano normali ? :-)))
Inoltre, ti consiglierei di disattivare il timer stesso tra una
chiamata e l'altra, in modo da evitare problemi di rientro.
sub timer1_timer
    timer1.enabled = false
        fai_questo
        fai_quell'altro
    timer1.enabled = true
end sub
T'interessa solo che le proc(X) vengano lanciate ogni dieci
secondi o devono proprio essere allo scattare del secondo
numero 10, 20 ecc. precisi, secondo il clock di sistema ?
Se è il primo caso, forse è più semplice mettere il timer
direttamente a 10000 ms, e gestire una static a rotazione.
sub timer1_timer
      Static X As Integer
      X = (X + 1) Mod 6
      Debug.Print "ciclo " & X
      Debug.Print Time
      Call proc(X)
end sub
Avevo un'altra cosa da dire, ma non mi sento un granchè bene,
e mentre scrivevo le cose sopra me la sono scordata :-(. Spero
che mi ritorni in mente, o che ci pensi qualcun altro :-).
Nel caso aggiungo.
Bye, G. 

 Bye, G.

 ha scritto nel messaggio 
news:86df2276-4ba8-4672...@e23g2000prf.googlegroups.com...


Mi salta un ciclo o me ne ripete uno due volte!!!!
Magari ha problemi ormonali...
OK, OK, vado a dormire, che è ora :-).
Bye, G. 

 Ciao Fede
Devo entare nella procedura allo scadere del secondo 10 -20 - 30 ecc.
Impostando il timer per esemipo a 500ms mi succede che mi entra per
due volte nella proc.
e questo non mi va bene!!!!!

 e questo non mi va bene!!!!!
Per evitare di chiamare piů volte la stessa proc_ consecutivamente
basterebbe una varabile che indichi qual č l'ultima proc eseguita, in modo
da testarla al "giro" dopo.
Poi, a seconda della politica da adottare in caso di chiamate che durano piů
di 10 secondi, il codice puň ulteriormente essere migliorato.
Bye
Raf

 Raf
In effetti non ci sono procedure che durano + di 10 sec. Succede che
se allo scattare dell'evento timer, il programma sta facendo altro,
allora nella sub timer non ci entra proprio. Ma è normale? Io pensavo
che comunque sia appena finiva di fare quello che stà facendo, nel
timer prima o poi ci entrasse!!!! Invece no!!! Lo santa proprio !!!!
Madonna mia!!!!!

Dovrei aver risolto.....mi sembra funzioni bene......facendo così:
timer a 100ms ed il seguente codice:
Private Sub Timer10_Timer()
Static X1 As Boolean
Static X2 As Boolean
Static X3 As Boolean
Static X4 As Boolean
Static X5 As Boolean
Static X6 As Boolean
Timer10.Enabled = False
If Second(Time) >= 10 And Second(Time) < 20 And X1 = False Then
        X1 = True
        X6 = False
        Debug.Print "inizio ciclo 1 " & Time
        Call proctq(1)
        Debug.Print "Fine ciclo 1 " & Time
End If
If Second(Time) >= 20 And Second(Time) < 30 And X2 = False Then
        X2 = True
        Debug.Print "inizio ciclo 2 " & Time
        Call proctq(2)
        Debug.Print "Fine ciclo 2 " & Time
End If
If Second(Time) >= 30 And Second(Time) < 40 And X3 = False Then
    X3 = True
    Debug.Print "inizio ciclo 3 " & Time
    Call proctq(3)
    Debug.Print "Fine ciclo 3 " & Time
End If
If Second(Time) >= 40 And Second(Time) < 50 And X4 = False Then
        X4 = True
        Debug.Print "inizio ciclo 4 " & Time
        Call proctq(4)
        Debug.Print "Fine ciclo 4 " & Time
End If
If Second(Time) >= 50 And Second(Time) < 59 And X5 = False Then
        X5 = True
        Debug.Print "inizio ciclo 5 " & Time
        Call proctq(5)
        Debug.Print "Fine ciclo 5 " & Time
 End If
If Second(Time) >= 0 And Second(Time) < 10 And X6 = False Then
        X6 = True
        Debug.Print "inizio ciclo 6 " & Time
        Call proctq(6)
        Debug.Print "Fine ciclo 6 " & Time
        X1 = False
        X2 = False
        X3 = False
        X4 = False
        X5 = False
End If
Timer_10.Enabled = True
End Sub
Praticamente seguendo i consigli un pò di tutti. Se vedete errori o
possibili migliorie, ditemi pure!
Grazie
Fabio