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 14007 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

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
4 oct. 2011 à 11:24
Bonjour,,

l'utilisation de la fonction sleep aurait pour effet de mettre en sommeil toutes tes instructions, pas uniquement celles du timer.
Mais alors, comment faire ?

et si tu nous disais quoi (comment faire quoi, exactement). Et la réponse dépendra de ce quoi (précis), très probablement.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 55
4 oct. 2011 à 12:42
Salut
quel est le but du loop for
For i = 0 To 9999999 
Next i 

dans l'évenement du timer ?
0
NHenry Messages postés 15030 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 26 novembre 2022 157
4 oct. 2011 à 13:06
Bonjour,

Si tu veux mettre en pause dans ton Timer sans bloquer le reste, évites d'utiliser seulement Sleep.

Utilises par exemple Sleep (petite durée, 1ms par exemple, cela reposera le processeur), DoEvents (pour permettre la génération des événements) et Timer ou TickCount (pour connaitre la durée).

Sinon, un booléen ou un compteur permettant de compter le nombre de passage dans ton timer avant de déclencher l'action.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
0
YellowAnt Messages postés 8 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 4 octobre 2011
4 oct. 2011 à 14:18
Merci pour cet éclaircissement. J'avais en effet perdu de vue que SLEEP allait figer l'ensemble des instructions.

Pour le QUOI, il s'agit en fait de réaliser des acquisitions de données, à l'aide de plusieurs appareils de mesures électriques et de multiplexers.
(Ce que j'ai remplacé dans mon expl précédent par une boucle For-Next).

le temps d'acquisition et d'enregistrement des mesures dure entre 3 et 5 secondes.
Je doit répèter l'opération toutes les 10s, 20s ou 60s, selon les configurations.

L'utilisation d'une routine TIMER ajustée, par expl à 10s, est en réalité répètée toutes les 13s à 15s (10s + 3s à 5s, selon les mesures relevées).

L'utilisation de l'objet Timer ne correspondant pas à ce que je recherche, je m'oriente vers une boucle "While", que j'active ou désactive en y incluant une variable de sortie, laquelle serait simplement liée à une mesure du temps système (comme avec Timer()).

Je devrait m'en sortir.

Merci.



the YellowAnt
0

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

Posez votre question
YellowAnt Messages postés 8 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 4 octobre 2011
4 oct. 2011 à 14:20
Merci NHenry,

Je vais m'orienter vers ça.
Timer et TickCount.


the YellowAnt
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
4 oct. 2011 à 14:45
Bonhour,

Je m'attendais à voir la sub Timer1 redémarrer 2000ms après son précédent lancement

Il faudra alors désactiver le Timer avant et le réactiver à la sortie.
Et l' idéal serait de mettre la boucle d' attente en dehors de la Sub Timer.

[] Ce qui va sans dire. va mieux en le disant.
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
4 oct. 2011 à 20:41
@ ShayW : C'est une boucle inutile permettant de générer un retard et ainsi démontrer que le démarrage d'un Tick de Timer dépends du temps qu'il lui même pris et que le le déclenchement d'un Tick de Timer démarre après la fin de l'exécution du précédent.

En pratique, c'est intéressant puisque cela tend à démontrer que deux Ticks ne peuvent se dérouler en même temps.

"Il faut diviser pour mieux régnier (Machiavel, mais contesté)".
En fait, si tu veux être sûr que la lourde exécution précédente n'entache pas (trop) la précision du Tick, il suffit de l'éliminer.
Imagine un Timer tournant à 1 seconde.
Il incrémente le nombre de passage (Ticks) et ne déclenche la grosse procédure qu'au bout de 10 comptages.
Là où tu peux intervenir, c'est que tu peux chronométrer la durée d'exécution de ta grosse procédure (TimerAprès - TimerAvant) et prédéfinir la valeur du compteur de cycle dès la fin de la grosse procédure.
Ainsi, le temps écoulé entre la fin de la grosse procédure et le début de la prochaine pourra être régulée.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
4 oct. 2011 à 20:55
Enfin des paroles (celles de Jack) sages.
J'étais sur le point de dire que j'ai constaté (après un nombre d'observations très très laborieuses ) qu'il m'est en général impossible de boire un café toutes les 5 minutes alors que j'en prends 10 pour boire chaque café.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
4 oct. 2011 à 21:18
Si (et cela m'arrive) je me transforme en timer :
Et s'il me faut moins de temps pour boire un café que l'intervalle de temps que je me suis fixé entre le moment ou je commence à boire un café et celui où je commence à boire le suivant et ainsi de suite ===>> alors là oui, je sais faire .
Mais est-ce bien là le voeu du demandeur ?
A lui de nous dire.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
4 oct. 2011 à 21:29
PS : L'utilisation des APIs comme SetTimer, KillTimer peut résoudre le problème, car ces APIs n'ont comme référence que la vitesse processeur.
Utilisation mainte fois exposé dans ce forum ou parmi les sources.
Voir aussi http://logiciel.codes-sources.com/

15 min plus tard : Je suis con : Au lieu de compter le nombre de tourn autant surveiller directement le temps écoulé (Timer)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
4 oct. 2011 à 23:08
Voilà donc un exemple de ce que je disais :
une exécution toutes les 2 secondes incluant une perte de temps (qui ne sera pas comptée) de moins de deux secondes :
Private Sub Form_Load()
  Text1.Text = ""
  Timer1.Interval = 1
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
  Static machin As double 
  If machin 0 Then machin Timer
  If Timer - machin >= 2 Then
    Text1.SelText = vbCrLf & Timer
     machin = Timer
     'on "perd" du temp qui ne sera pas compté, mais à condition qu'il soit < 2 secondes
    For i =  0 To 9999999
    Next i
  End If
End Sub

Je ne fais pour cela pas "battre" mon timer toutes le 2000 millisecondes, mais toutes les millisecondes. C'est en son sein, que je calcule le temps écoulé et que j'établis le battement effectif.
Le maintenant très léger décalage éventuellement résiduel ici où là , insignifiant, n'est pas dû à la boucle de perte de temps, mais aux temps d'affichage.




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
4 oct. 2011 à 23:51
au fait,

For i = 0 To 9999999
Next i

combien dure-t-elle ?

Et si c' est plus de 1,
Timer serait-il en mesure de l' interrompre ?


[] Ce qui va sans dire. va mieux en le disant.
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
5 oct. 2011 à 10:47
Non, il ne pourra pas l'interrompre puisqu'il ne se redéclenchera qu'une fois son exécution précédente achevée.
Pour faire cela, il faudrait un second Timer qui lèverait un drapeau booléen que la première boucle (grosse procédure) viendrait lire MAIS à la condition expresse que la grosse procédure renferme un DoEvents.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
5 oct. 2011 à 11:03
Je plussoie jack.

A quoi servirait d'ailleurs d'interrompre des instructions dont l''on souhaite l'exécution jusqu'au bout ?
La boucle montrée dans le timer (faut-il le rappeler ?) n'était qu'à titre de démo (simulation d'une attente de finalisation d'exécution). Rien d'autre !
Par contre : nous n'avons toujours pas de réponse à :
et si tu nous disais quoi (comment faire quoi, exactement). Et la réponse dépendra de ce quoi (précis), très probablement.




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
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 à 11:24
Bonjour Jack, Bonjour ucfoutu.

Tout à fait ucfoutu,
Son but étant un relevé à interval régulier, imaginons la chose suivante.

Const Latence = 1

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

Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = Latence
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Debug.Print ATTENTE
End Sub

Private Sub Command1_Click()
Timer1.Enabled = False
End Sub


[] Ce qui va sans dire. va mieux en le disant.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
5 oct. 2011 à 11:37
Ouais ...
En dehors de la réponse attendue (message précédent) :
J'aimerais bien que l'on relise ce que je disais à propos des cafés bus.
Car il y a une énorme différence entre :
1) Commencer à boire un café toutes les 10 minutes (5 m'étant nécessaires pour boir chaque café)
et
2) Commencer à boire un nouveau café 10 minutes après avoir fini de boire le précédent
et
3) commencer à boire un nouveau café immédiatement après avoir fini de boire le précédent si plus de 9 minutes et 59 secondes se sont écoulées depuis que j'ai commencé à boiere le café précédent. (ressemble au cas 1, mais n'est pas tout-à-fait le même, hein !)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
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 à 11:42
Rien ne t' obliges de boire la tasse en entier ,
si le but étant de savoir comment tu le trouves, le café !

[] Ce qui va sans dire. va mieux en le disant.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
5 oct. 2011 à 11:45
Oui ?
Et alors ?
Il lance un traitement et l'arrête dans son timer (et comment, selon le traitement ?) pour le relancer illico-presto par le timer ?
Bizarre, comme stratégie

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
5 oct. 2011 à 11:47
Sans compter que si le traitement interrompu a modifié des choses à son premier lancement, le second traitement va traiter des choses modifiées ! Et s'il s'agit par exemple d'un calcul ===>> bonjour les gros dégâts) !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
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 à 11:59
[i]Pour le QUOI, il s'agit en fait de réaliser des acquisitions de données, à l'aide de plusieurs appareils de mesures électriques et de multiplexers.
(Ce que j'ai remplacé dans mon expl précédent par une boucle For-Next). /ile temps d'acquisition et d'enregistrement des mesures dure entre 3 et 5 secondes.
Je doit répèter l'opération toutes les 10s, 20s ou 60s, selon les configurations.

D' après lui, le traitement consiste à recevoir des données,
et les affichent toutes les n secondes.
Rien de plus.

Et sur cette base qu' on est parti.
Sa boucle sert à faire patienter le Timer le laps de temps pour atteindre le délai fixé.



[] Ce qui va sans dire. va mieux en le disant.
0