Timer exécute fct chaque seconde mais comme la fct dure des ms le Timer est déca

Résolu
JeanLouisBzh - 13 juin 2013 à 15:40
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 18 juin 2013 à 17:03
Bonjour, excusez moi pour le sujet mais je n'arrive pas à bien m'expliquer...

Alors voila, j'ai un petit soucis avec mon code. Je voudrais créer un Timer qui exécute une fonction toutes les secondes. Le seul problème est que mon ma fonction dure plus de 100mS donc quand mon Timer fini d'exécuter ma fonction et qu'il tourne il gagne 100mS (durée totale 1,1s)et au bout de quelques minutes ces mS sont devenues des secondes de décalage...

J'ai essayé de lancer un Timer2 avec une détection d'un état sur le premier permettant au deuxième de tourner mais lorsque Timer1 active le deuxième le programme suit dans le Timer2 alors qu'il faudrait que le Timer1 tourne encore pour ne pas être décalé.

J'espère être clair mais c'est pas évident

Merci d'avance !
A voir également:

13 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 juin 2013 à 10:18
Bonjour,
Je suis absolument d'accord avec le contrôle de l'avancement de l'horloge dans l'évènement Timer du Timer.
Mais, au contraire de la solution proposée (exécuter le timer très fréquemment), je choisirais un intervalle égal à une seconde - au moins la perte probable de temps d'exécution

Un petit test :
un bouton command1 pour démarrer le timer
un bouton command2 pour l'arrêter
une listbox list1 pour preuve
et ce code
Dim perte As Integer
Private Sub Command1_Click()
  perte = 200 ' ici 200 millisecondes
  intervalle_souhaité = 1000 ' pour exécution toutes les secondes
  Timer1.Enabled = True
  Timer1.Interval = intervalle_souhaité - perte
End Sub

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

Private Sub Timer1_Timer()
  Static toto As Double
  If toto 0 Then toto Timer
  If Timer - toto >= Timer1.Interval / 1000 Then
    List1.AddItem Time ' --- pour rempérer les moments d'exécution
    perdre_du_temps ' on simule la durée d'exécution de ta fonction
    toto = Timer
  End If
  List2.AddItem toto
End Sub

Private Sub perdre_du_temps()
'on va ici perdre volontairement du temps (200 milliseconds)
'pour simuler la durée d'exécution de ta fonction
  Dim deb As Double
  deb = Timer
  Do While Timer - deb < perte / 1000
    DoEvents
  Loop
End Sub




________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
JeanLouisBzh
18 juin 2013 à 16:43
Pour ceux que ça intéresse j'ai encore une autre solution, je regarde les secondes du système (PC) Intervalle du timer est 1ms


Private Sub Timer1_Timer()
secondes1 = Second(Now)
If secondes1 <> secondes2 Then
Enregistrement_data
End If
secondes2 = Second(Now)
End Sub


secondes1 et secondes2 déclarées dans mon Form_load.

Lorsque les 2 valeurs sont différentes avec un rafraichissement tout les millisecondes je lance mon programme qui dure entre 100ms et 200ms. Ce qui aura pour effet de déclencher a chaque nouvelle seconde!

En espérant en aider d'autres !
3
Utilisateur anonyme
13 juin 2013 à 15:48
Bonjour,

j'ai un petit soucis avec mon code


Il est où le code ?
0
JeanLouisBzh
13 juin 2013 à 16:00
Je me suis mal exprimé, je n'ai pas de soucis avec mon code. Le code que j'ai fonctionne (avec mon Timer) mais pas comme je voudrais, d'où mon problème.
0

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

Posez votre question
Utilisateur anonyme
13 juin 2013 à 16:06
Reste juste à attendre le devin de service. De toute évidence, il y a une instruction mal placée au sujet du Timer.
0
JeanLouisBzh
13 juin 2013 à 16:39
Ayant modifié mon programme 20 fois, je le refais et je l'envoi.
Pas besoin d'un devin

La problème est juste : "lorsque Timer1 active le deuxième, le programme suit dans le Timer2 alors qu'il faudrait que le Timer1 tourne encore tout seul pour ne pas être décalé."
0
JeanLouisBzh
13 juin 2013 à 17:18
Private Sub TIM_REEL_Timer()
Static j As Integer
j = j + 1
If j = 10 Then
TIMER_DECLENCHE.Enabled = True
j = 0
End If
End Sub
Private Sub TIMER_DECLENCHE_Timer()
If (CHK_AMT = 1) Then           'Si AMT coché alors envoi de la commande par RS
Trame = "AMT" & (vbCrLn)        'Envoi de AMT et du CR et NL
Form1.Recuperation_Trame        'Traitement de la réponse reçue
TXT_VERIF_ENVOI.Text = Trame    'TXTBox pour verifier l'envoi de la trame
End If
If (CHK_MMT = 1) Then 'Si MMT coché alors envoi de la commande par RS
Trame = "MMT" & (vbCrLn)        'Envoi de MMT et du CR et NL
Form1.Recuperation_Trame        'Traitement de la réponse reçue
TXT_VERIF_ENVOI.Text = Trame    'TXTBox pour verifier l'envoi de la trame
End If
TIMER_DECLENCHE.Enabled = False
End Sub


Voilà un bout du code, lorsque j'active TIMER_DECLENCHE le soft continue de tourner dans le TIMER_DECLENCHE et perd donc du temps a effectuer les calculs alors que je voudrais simplement l'activer et il faudrait que TIM_REEL tourne sans cesse pour ne pas décaller les secondes. (TIM_REEL = 1s mais TIMER_DECLENCHE 100mS donc au lieu de TIM_REEL 1s je me retrouve à 1,1s)
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
13 juin 2013 à 19:17
Bonjour,

Pourquoi ne pas appeler plus souvent et regarder l'horloge système pour déclencher toute les secondes ?

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]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
Utilisateur anonyme
13 juin 2013 à 22:19
Bonjour,

Enlève cette ligne:

TIMER_DECLENCHE.Enabled = False


Parce qu'elle désactive ton Timer à chaque fois qu'il est lancé. Cela fait qu'au lieu de terminer ta seconde après l'enregistrement (reste envirom 900 ms), il commence une nouvelle seconde à chaque fois.

Et puis je ne suis même pas certain que tu aies besoin de 2 Timers.
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
13 juin 2013 à 22:59
Salut

Je te rassure, ce n'est pas un bug mais un comportement normal.
Un objet Timer ne redémarre que lorsque le code qu'il supporte est achevé, créant ces décalages.
Il faut lancer le code et redonner tout de suite la min au programme pour que le timer se relance : lancer un autre programme sans en attendre de résultat ?
Autre solution palliative : faire tourner ton timer le plus vite possible et, dans son code, regarder et attendre le changement de seconde de l'horloge système pour déclencher le vrai code.

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 le partage (Socrate)
0
JeanLouisBzh
14 juin 2013 à 09:33
Bonjour à tous, merci pour vos réponses :

@NHenry : je vais essayer de faire comme tu dis avec l’horloge du système, j'ai trouvé comment l'afficher, je vais essayer de me synchroniser sur les secondes.

@cmarcotte : si j’enlève la ligne
TIMER_DECLENCHE.Enabled = False
mon deuxième Timer n'est plus synchronisé et c'est justement mon but

@jack : Je vais essayer ce que tu dis, comme NHenry, synchroniser mon Timer sur l'horloge système.

Merci à vous,je vous tiens au courant!
0
JeanLouisBzh
17 juin 2013 à 13:36
Merci beaucoup a vous tous, j'utilise ta méthode ucfoutu, je pense que c'est la plus simple. Ca fonctionne !!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 juin 2013 à 17:03
Oui, bien sûr, mais tu fais ainsi une sur-utilisation évitable et à éviter de ton contrôle timer (toutes les millisecondes...)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Rejoignez-nous