Probleme timer 1 ms

jeanjeank40 Messages postés 6 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 24 juillet 2006 - 24 juil. 2006 à 12:55
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 24 juil. 2006 à 19:26
Bonjour,

Une petite question urgente, peut être bête, mais que je la pose quand même :
Pourquoi un timer avec un intervalle de 1 ms met 10 s pour faire 1000 passages dans sa routine? En principe pour faire 1000 passages il devrait mettre 1 s (car 1000 x 1ms = 1s)?

Pour verifier j'ai fait un petit programme avec un timer, un bouton de commande et un textbox, ce qui donne :
  
Option Explicit
Dim counter As Integer



Private Sub Command1_Click()
If Not Timer1 Then
    Text1.Text = 0
    counter = 0
    Timer1.Enabled = True
Else
    Timer1.Enabled = False
End If
End Sub



Private Sub Timer1_Timer()
    If counter = 1000 Then
        Timer1.Enabled = False
        Text1.Text = counter
    Else
        counter = counter + 1
    End If
End Sub


On peut verifier que pour 1000 passages il faut beaucoup plus de 1 s.

Si quelqu'un pouvait m'éclairer je lui saurais gré.

Merci, jean

9 réponses

bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
24 juil. 2006 à 13:12
Il s'agit de l'eternel problème de précisions des Timer.
Je n'ai jamais utiliser un Timer avec un gros besoin de précisions, mais j'ai souvent entendu dire que Timer et précision n'etaient pas sur la même page du dictionnaire ^^

Pourquoi a tu besoins de mettre le timer sur 1ms ?

Bonne prog ++
0
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
24 juil. 2006 à 13:19
bonjour,

je pense que ce qui prend du temps, c'est les instructions que tu exécutes dans la procédure suivante :

Private Sub Timer1_Timer()
If counter = 1000 Then
Timer1.Enabled = False
Text1.Text = counter
Else
counter = counter + 1
End If
End Sub

Cela prend des cycles au processeur afin de récupérer en mémoire la valeur de counter, la comparer à 1000, si oui -> ...

Chacune de ces instructions prend quelques ms à s'exécuter, donc tu n'auras pas 1 ms * 1000 mais 1 ms * 1000 * nb_de_ms_a_executer_dans_cette_procédure.

de plus, appeler cette procédure toute les milliseconde, c'est trop rapide car elle n'a pas le temps de s'exécuter compplement alors qu'une autre itération de timer1 est invoquée, ce qui, je pense force a empiler et dépiler énormement les variables.

ce code s'exécute ainsi bcp + vite, mais oblige d'avoir un timer1 à 5 ms :

Private Sub Timer1_Timer()
If counter < 200 Then
counter = counter + 1
Else
Timer1.Enabled = False
Text1.Text = counter
MsgBox "fin " & CStr(counter)
End If
End Sub

de plus, j'ai mis le test le plus probable en premier, car si tu compares counter à 1000, cela n'est vrai qu'une fois sur 1000 et oblige de faire un saut à chaque iteration.

maintenant, il t'est possible d'attendre 10s avec le timer, mais par contre cela n'incrementera plus le compteur a chaque milliseconde.


J'espère avoir répondu a ta question.

yk.
0
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
24 juil. 2006 à 13:30
bonjour,

sinon, sil te faut impérativement attendre 1s, mais que counter ne soit pas forcement = à 1000, tu peux utiliser un deuxieme timer, et le mettre à 1s.

Option Explicit

Dim counter As Integer

Private Sub Command1_Click()

Text1.Text = "en cours..."
counter = 0
Timer2.Enabled = True
Timer1.Enabled = True

End Sub

Private Sub Timer1_Timer()
counter = counter + 1
End Sub

Private Sub Timer2_Timer()
Timer1.Enabled = False
Text1.Text = counter
Timer2.Enabled = False
End Sub

yk
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 juil. 2006 à 13:34
Le controle Timer de VB n'est pas du tout precis. De plus la durée que tu indique pour interval, n'est pas la périodicité d'exécution du timer (contrairement à ce qui peut etre dit dans l'aide) mais la durée de repos entre 2 exécutions. J'ai fais personellement une expertise sur ce problème.

Ainsi si tu programme ton timer à 150ms mais que ta routine met 25ms à s'éxécuter, elle sera donc exécutée toutes les 175ms.

Si tu veux des timers precis faut passer par les API windows.

Sevyc64  (alias Casy)

<hr /># LE PARTAGE EST NOTRE FORCE #
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jeanjeank40 Messages postés 6 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 24 juillet 2006
24 juil. 2006 à 15:51
Merci à tous pour vos réponses.

   Pour expliquer mon problème un peu plus clairement, je dois réaliser un système d'acquisition à partir d'une carte (LabJack UE9) que je programme en visual basic.
Un chenillard me permet d'éclairer  3 DEL (l'une aprés l'autre), je dois récupérer une mesure analogique grâce à ma carte et la stocker dans un tableau en fonction de la DEL allumée. Pour savoir la diode allumée je teste 3 entrées analogiques de la carte sur laquelle sont branchées les DEL.

   Le problème est qu'en utilisant un timer classique je ne peux pas atteindre une fréquence de fonctionnement suffisante. Le mieux que j'ai pu faire a été 100 acquisition par seconde soit une fréquence de fonctionnement de mon système de 33 Hz ce qui est beaucoup trop faible pour mon application. Il me faudrait atteindre une fréquence de 100 ou 200 Hz, c'est-à-dire 300 ou 600 acquisition par seconde.

   Toutes suggestions seront les bienvenues, notamment sur l'utilisation des timers de l'API Windows

jean
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
24 juil. 2006 à 16:14
Salut,

Voici l'api :

<small> Coloration syntaxique automatique </small>

Fonction GetTickCount  

Declare Function GetTickCount Lib "kernel32" () As Long   
Versions :  
. Windows 95/98 : Oui  
. Windows NT : A partir de 3.1  
. Windows 2000/XP : Oui  

Description :  
Cette fonction vous donne le nombre de millisecondes qui se sont écoulées  
depuis le début de la session courante de Windows.   
Elle peut vous éviter d'utiliser dans certains cas un contrôle Timer, ou bien  
elle peut servir dans le cadre de calcul d'intervalles de temps plus précis  
que ce que donne la fonction Time de VB.   
Vous pouvez consulter un exemple de son utilisation dans Colonnes (onglet Programmes).  

Exemple d'utilisation :  

Public Sub Sleep(lgMSec As Long)  
' Procédure de temporisation
' Le temps d'attente donné en paramètre en millisecondes est approximatif
Dim lgTime As Long  
lgTime = GetTickCount  
Do While lgTime + lgMSec > GetTickCount  
    DoEvents  
    DoEvents  
    DoEvents  
Loop  
End Sub 

<small> Coloration syntaxique automatique </small>

@++

  Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"

Merci de prendre le temps de répondre à ce
sondage


Merci de prendre le temps de lire
le Règlement CS


    http://www.smileycentral.com/?partner=ZSzeb008_ZNxdm414YYFR
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 juil. 2006 à 16:18
Pour les api, il faut que tu passe par les fonctions CreateTimerQueue et CreateTimerQueueTimer.

Télécharge l'Api Guide tu as un exemple d'utilisation dedant --> ici

Sevyc64  (alias Casy)

<hr /># LE PARTAGE EST NOTRE FORCE #
0
jeanjeank40 Messages postés 6 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 24 juillet 2006
24 juil. 2006 à 16:25
Encore merci de votre aide, j'ai télécharger "API-GUIDE 3.7" et je vais essayer la fonction "timeSetEvent" je pense. Je posterais à nouveau une fois testé pour vous dire si cela a été efficace.

jean
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 juil. 2006 à 19:26
salut,
pour info la précision du timer VB est de 18ms mini. donc mettre 1 2 5 10 18, c'est pareil.

en effet il faut passer par les API : tps = 10ms, soit 100hz (donc pas encore assez pour tes besoins).

pour arriver jusqu'à du 1Mhz il faut passer par les API MIDI.

regarde ici si tu veux pour le principe du timer par API mais surtout lis les commentaires déposés, ils te seront utiles.

(PS Mortalino : ta fonction est fausse )

++
PCPT  [AFCK]
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
0
Rejoignez-nous