jeanjeank40
Messages postés6Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention24 juillet 2006
-
24 juil. 2006 à 12:55
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDerniè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é.
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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 ?
Ulala2
Messages postés86Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention10 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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
Vous n’avez pas trouvé la réponse que vous recherchez ?
jeanjeank40
Messages postés6Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention24 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
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
jeanjeank40
Messages postés6Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention24 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.