ScSami
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
24
8 janv. 2006 à 16:05
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". )