Timer

YellowAnt Messages postés 8 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 4 octobre 2011 - 4 oct. 2011 à 11:13
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 5 oct. 2011 à 13:43
Bonjour à tous.

Après quelques heures de recherche, aidé d'un collègue, nous coinçons sur un problème de TIMER.

Le timer VB semble fonctionner comme une pause et pas comme un timer indépendant.
Un expl. étant plus parlant, voici le code :

[i]Private Sub Form_Load()
Text1.Text = ""
Timer1.Interval = 2000
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Text1.Text = Text1.Text & vbCrLf & Timer()
For i = 0 To 9999999
Next i
End Sub/i

Le résultat est le suivant:
39142.48
39144.59
39146.71
39148.82
On remarque que le temps système est incrémenté des 2000ms de timer1.interval, mais que le temps de la boucle For-Next y est ajouté.
Je m'attendais à voir la sub Timer1 redémarrer 2000ms après son précédent lancement (quelque soit la durée des opérations exécutées dans la routine sub.
Mais en réalité la sub Timer1 redémarre seulement lorsque les opérations (ici, For-Next) sont terminées.
Je me rends bien compte de l'intérêt de ce fonctionnement dans le cas où Timer1.Interval est inférieur à la durée des opérations. Ce qui engendrerait soit un plantage, soit la création d'une nouvelle occurence de timer1?

Mais alors, comment faire ?
Quel est l'intérêt d'utiliser l'objet Timer, plutôt que la fonction "sleep", afin d'effectuer une simple pause avant ma boucle For-Next ?
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Merci pour votre aide.

The YellowAnt

22 réponses

LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
5 oct. 2011 à 12:11
Autrement dit:

Function RELEVE() As String
Dim ATTENTE As Double, i As Double

Timer1.Enabled = False
ATTENTE = Timer()

'<RELEVE=TRAITEMENT>

For i = 0 To 9999999
If Timer() - ATTENTE >= Latence Then
Exit For
End If
Next i
Timer1.Enabled = True
End Function

Private Sub Timer1_Timer()
Debug.Print RELEVE
End Sub

Tu remarqueras que j' ai désactivé le Timer avant et je l' ai réactivé après pour ne pas interrompre RELEVE.



[] Ce qui va sans dire. va mieux en le disant.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 oct. 2011 à 13:43
Timer1.Interval = Latence
Le 'Interval' des Timer s'exprime en mSec.
Mettre 1 revient à ne rien faire de plus qu'une boucle sans fin puisque VB descendra très difficilement en dessous des 50 mSec.
0
Rejoignez-nous