Timer Control

Signaler
Messages postés
4
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
8 février 2011
-
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
-
Salut à tous !

Langage : VB6
Application : un WebBrowser et un Timer.

Je désire créer une application avec laquelle une page Internet contenu dans le WebBrowser s'actualise à intervalles de temps réguliers.

Pour cela j'utilise la propriété 'Interval' du Timer, mais je ne sais pas comment
réaliser la fonction d'actualisation du WebBrowser à intervalle de temps défini par un Timer.

La Question est donc :
Comment lié l'actualisation de la page Internet à cet intervalle de temps ?

Merci à tous !!

7 réponses

Messages postés
338
Date d'inscription
mardi 28 janvier 2003
Statut
Membre
Dernière intervention
4 novembre 2008
1
Chaque control timer a un evenement Timer qui s'execute a un interval regulier définit par l'utilisateur par la propriété Interval en milliseconde

Private Sub Timer1_Timer()
actualiser_WebBrowser
End Sub

Hassen TUNISIE
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
22
La question est en effet ambigue car on ne sait pas si tu sais (si tu as bien compris le fonctionnement) te servir des procédures événementielles (dont celle du Timer) où si ton problème réside uniquement dans le fait de relancer la même page !?

Le Timer, dès que sa propriété ".Enable" est à True (autrement dit, dès que le timer est actif), il éxécute la procédure événementielle "NomDuTimer_Timer()" dans laquelle tu es libre de mettre ce que tu veux. Il l'exécute selon la valeur de sa propriété ".Interval" qui est donc en millisecondes.

Il te suffit donc de mettre le code pour actualiser ta page dans cette procédure (double clique sur l'image du Timer pour que l'IDE [l'interface utilisateur du VB] de VB te crée automatiquement cet procédure [c'est-y pas magique le VB parfois !!!] ). Autrement dit, il faut remplacer "actualiser_WebBrowser" (du code de Hassen) par celui que tu veux.

Mais il faut cependant faire attention à une chose très importante...
Si la procédure _Timer n'est pas terminée lorsque le nouveau délais est écoulé (le top se produit toujour au lancement de la procédure : 3-2-1-Procédure lancé-3-2-1-Proc lancée-3-2-1-...) le VB va exécuter une nouvelle "instance" de cette procédure (un peu comme si tu en avais deux). Or, comme tout est à peu près mathématico-logique en électronique, il y a de fortes chances que cette nouvelle instance ne se finisse pas non plus à temps. Du coup, il se produit un inévitable bourrage, une boucle sans fin d'appels récursifs à ta procédure ce qui entraine un grave erreur...
Bon, je sais pas si j'ai été très clair là, mais pour plus d'nfos fait une recherche sur la "récursif/récursivité"des procédures...

Donc, pour éviter ce problème il y a deux moyens :
Le premier, lorsque l'on rentre dans la procédure on suspend le Timer afin qu'il ne la relance pas (une nouvelle "instance" de la procédure) durant son exécution. Autrement dit, on désactive le Timer (via sa propriété Enable à False) en entrant dans la procédure puis le réactive en sortant.
Private Sub Timer1_Timer()
Timer1.Enable = False
... 'Ton code ...
Timer1 .Enable = True
End Sub

Cette technique à l'inconvénient de ne garantir ni les délais, ni la sécurité car la récursivité peut encore exister (si le délais est trop court, il se peut que la procédure soit réappelée en sa déclaration et le moment de couper le Timer)... Mais bon, c'est tout de même sûr à 99,999 %.
Elle ne garantie pas les délais car en fait il faudra rajouter au délais le temps d'exécution de la procédure (puisque le délais a été suspendu...). Autrement dit :
VraiDélai = Timer1.Interval + TempDeExecutionDeLaProcédure

L'autre technique est d'ordre plus générale et donc, à préférer pour la lecture du code par un autre... (faut prendre tout de suite de bonnes habitudes ).
Elle permet, justement, d'éviter la récursivité. Mais elle aussi a quelques inconvénients...

'Variable Globale déclarée tout en haut de ton code (voire dans un module de code)
Public varAntiRecursif As Boolean
...
Private Sub Timer1 _Timer()

If varAntiRecursif = True Then Exit Sub

varAntiRecursif = True

... 'Ton code ...
'Si tu dois quitter la procédure, n'oublie pas de remettre la variable d'anti-récursivité
'Parce que si toutes tes procédures sont équipées de ce système, plus une seule ne fonctionnera!!!
If machin pasBon Then varAntiRecursif False: Exit Sub

... 'Ton code ...


varAntiRecursif = False


End Sub


Ainsi, la procédure ne pourra pas s'exécuter tant que la première instance n'aura pas rétablie et ce, grace au teste logique effectué au début. Alors, comme l'autre, elle n'est pas sûre à 100% mais c'est le moyen le plus acceptable d'éviter les ennuis. A tel point que je te conseil vivement de prendre l'habitude d'implémenter ce système d'emblé à toutes tes procédures!
L'avantage de cette technique concernant le Timer c'est qu'elle ne l'arrête pas. L'inconvénient, en revanche, c'est que s'il venait à se produire un décalage temporelle dans l'exécution
du code
(pour dieu sait quelle raison... là n'est pas la question) et que la procédure soit rappelée en cours d'exécution (d'elle même donc), eh bien l'intervalle serait purement et simplement ignoré (enfin, d'un point de vue effectif). Du coup, les intervalles
(quand ils sont courts)
risquent de ne pas être réguliers et ce, de manière imprévisible ! Mais dans la grande majorité du temps, ce n'est pas gênant pour le programme.

Pi de toute façons, on ne met pas un timer à 1 milliseconde !!! Si on veut exécuter un code de manière permanente, on emploi la bonne vieille technique de la routine, à savoir, une bonne vieille boucle Do/Loop/Exit Do !

Celà répond-t-il à ta question ?

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
25
un Timer peut-il se déclancher alors qu'il est en cours ?

j'avais des doûtes.

après vérification, non ce nest pas le cas ScSami

même avec un Doevents.







Dim Tps As Long



Private Declare Function GetTickCount Lib "kernel32" () As Long



Private Sub Form_Load()

Timer1.Interval = 1000

Timer1.Enabled = True

End Sub



Private Sub Timer1_Timer()

Text1 = Now

Tps = GetTickCount



While GetTickCount - Tps < 10000

DoEvents

Wend



End Sub

Daniel
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
22
Humm... Etrange... En effet, après vérification (comme quoi, faut pas croire tout ce qu'on nous apprends dans les bouquins!!!), en effet, Timer ne peut pas se redéclancher en cours...
Pourtant, il m'est arrivé à de nombreuses reprises d'avoir des "bugs"que j'attribuais à ce phénomène...
Ben alors c'est que je devais appeler la procédure _Timer de l'extérieur (chose a ne pas faire donc!!!).

Merci Gobillot (tu m'excuses hein si je dis parfois des conneries!!! )

Ceci invalide donc la première solution. N'en reste pas moins que je conseille quand même d'utiliser la deuxième (histoire de sécurité) ! Qu'en dis-tu Dan ??? (Je dis encore une connerie plus grosse que moi ou pas sur ce coup ??? )

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
25
si tu veux parler du varAntiRecursif
qui se trouve dans le Timer,

ben là il n'est pas nécessaire, puisque de toute façon il est protégé
d'office et ne se redéclenchera pas une seconde fois, un peu comme la
gestion d'erreur qui est désactivée en cas d'erreur pour éviter
justement l'apparition de boucles infinies.



la méthode du Booléan est valable pour un bouton par exemple qui lui
peut se déclencher 2 fois. un autre moyen de l'éviter c'est de mettre
des enabled aux endroits chauds. attention aussi au clavier qui peut
déclencher des évênements intempestifs. cela abouti en général à un
magnifique plantage qui n'est pas évident à débugger si on ne pense pas
aux déclenchements en chaîne.



Pour le Timer vaux mieux éviter de faire des traitements qui soit plus
long que l'interval de temps qu'on lui a déterminé, sinon on saute des
traitements, autant augmenter ce temps et être raisonnable, sachant
qu'en dessous de 10 millisecondes c'est totalement imprécis. et ne pas
oublier de mettre de Doevents si le traitement est trop long (8
secondes sans Doevents et ça a planté Vb, bigre ...)

j'ai essayé avec plusieurs Timers, le traitement trop long de l'un
n'empêche pas le déclenchement de l'autre, c'est une bonne chose.



Pour le cas présent, un Timer me semple approprié, je sais pas ce qu'il
faut entendre par réactualisation, peut être un peu comme fait IE, si
page identique à celle de l'historique, ne pas réafficher la même page,
ça me semble une perte de place et une perte de temps, et en plus ça
marche pas très bien, autant tout réafficher à chaque fois comme ça on
est sur d'avoir la dernière page en cours.




Daniel
Messages postés
4
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
8 février 2011

Merci pour vos réponses, j'ai désormais bien compris le fonctionnement du control Timer, et de plus ça marche !!

Paul
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
22
Pense à toujours accepter les réponses correctes (ou les réponses des gars qui t'on aidé) afin que ce post s'affiche en vert dans la liste. Ceci indique aux lecteurs du forum que ta question a bel et bien trouvée une réponse - ce qui peut éviter qu'ils reposent la même! Ca permet également aux gars qui répondent de savoir quel sont les posts encore en manque de résultat!

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )