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 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention
- 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 !
Afficher la suite 

13 réponses

Répondre au sujet
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 14 juin 2013 à 10:18
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ucfoutu
JeanLouisBzh - 18 juin 2013 à 16:43
+3
Utile
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 !
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de JeanLouisBzh
Utilisateur anonyme - 13 juin 2013 à 15:48
0
Utile
Bonjour,

j'ai un petit soucis avec mon code


Il est où le code ?
Commenter la réponse de Utilisateur anonyme
JeanLouisBzh - 13 juin 2013 à 16:00
0
Utile
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.
Commenter la réponse de JeanLouisBzh
Utilisateur anonyme - 13 juin 2013 à 16:06
0
Utile
Reste juste à attendre le devin de service. De toute évidence, il y a une instruction mal placée au sujet du Timer.
Commenter la réponse de Utilisateur anonyme
JeanLouisBzh - 13 juin 2013 à 16:39
0
Utile
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é."
Commenter la réponse de JeanLouisBzh
JeanLouisBzh - 13 juin 2013 à 17:18
0
Utile
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)
Commenter la réponse de JeanLouisBzh
NHenry 14129 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 19 avril 2018 Dernière intervention - 13 juin 2013 à 19:17
0
Utile
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
---
Commenter la réponse de NHenry
Utilisateur anonyme - 13 juin 2013 à 22:19
0
Utile
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.
Commenter la réponse de Utilisateur anonyme
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 13 juin 2013 à 22:59
0
Utile
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)
Commenter la réponse de cs_Jack
JeanLouisBzh - 14 juin 2013 à 09:33
0
Utile
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!
Commenter la réponse de JeanLouisBzh
JeanLouisBzh - 17 juin 2013 à 13:36
0
Utile
Merci beaucoup a vous tous, j'utilise ta méthode ucfoutu, je pense que c'est la plus simple. Ca fonctionne !!
Commenter la réponse de JeanLouisBzh
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 juin 2013 à 17:03
0
Utile
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.
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.