Maitrise d'un timer

JEANJON38 Messages postés 9 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 5 mai 2011 - 23 févr. 2011 à 20:05
JEANJON38 Messages postés 9 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 5 mai 2011 - 28 févr. 2011 à 10:03
Bonjour

Voici mon petit casse tête :
Je lance timer qui appel des sous programmes (4)en cascades.
Les sous programmes sont plus rapides que le Timer.
Le dernier SP relance le premier SP
ce qui fait qu'en une seconde le cadencement est aléatoire je peut avoir les résultats
a la seconde 1 de SP1,SP2,SP3,SP4
à la seconde 2 de SP1,SP2,SP3
a la seconde 3 de SP4,SP1,SP2,SP3 etc...
je n'arrive pas à cadre les données dans la seconde.
Les SP ont largement le temps de s'exécuter en une seconde.

Je souhaiterai lancer l'appel des 4 SP et vérifier que le timer ait bien fini son cycle avant de relancer une séquence.

En gros voici la structure du programme:
Form
APPEL=1
end sub

timer

ICI bloquer le cycle jusqu'à la relance du timer

If APPEL=1 Then call SP1
If APPEL=2 Then call SP2
If APPEL=3 Then call SP3
If APPEL=4 Then call SP4
end sub

SP1
Emet et reçoit des trames IP
APPEL=2

SP1
Emet et reçoit des trames IP
APPEL=3

SP1
Emet et reçoit des trames IP
APPEL=4

SP1
Emet et reçoit des trames IP
APPEL=1

Bon la structure est peut être un peu tirée par les cheveux mais pour réussir à marier le temps et les appels IP je n'ai pas réussi à faire mieux.

Si vous avez eu le courage de tout lire, je vous remercie d'avance pour votre aide car pour le moment je suis bloqué.

10 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
23 févr. 2011 à 21:39
Bonjour,

Malheureusement, vb6 ne permet pas l'exécution de threads, donc il sera difficile de faire mieux.
Ce que tu peux tenter si tes procédures sont assez rapide, c'est de faire tourner tes timers plus vite que la secondes et ensuite, mettre un contrôle pour n'exécuter le traitement qu'une fois par secondes.

Mais je ne vois pas bcp mieux.

0
JEANJON38 Messages postés 9 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 5 mai 2011
24 févr. 2011 à 08:03
Bonjour,

Merci pour l'info bien que je ne l'ai pas précisé mon timer est déja inférieur à la seconde.
Par contre j'ai essayé de comparer la progression du temps TIME par rapport au timer pour le moment ce n'est pas concluant mais je vais persévérer.

Merci.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
24 févr. 2011 à 10:17
Bonjour,

Si les 4 taches doivent être exécutées à la suite, tu peux les mettre dans un même Timer (avec peut être un DoEvents si besoin).

Sinon, regardes le temps réellement consommé avec l'API GetTickCount par exemple, ça te donnera un temps précis à la Miliseconde, ensuite, tu pourra mieux comprendre pourquoi ça ne passe pas.

0
JEANJON38 Messages postés 9 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 5 mai 2011
25 févr. 2011 à 08:18
Bonjour,

Suite à ton conseil j'ai opéré de la façon suivante :
Conditions:
Les requètes pour les 4 voies doivent être envoyées en moins d'une seconde.
Timer1 = 200ms
Je place un controle TEMPS=time dans SP1
A la place de "ICI bloquer le cycle jusqu'à la relance du timer "
J'ai place un controle basé sur time .Je n'execute les appels tant que le time n'est pas passé à la seconde suivante.

timer1

'ICI bloquer le cycle jusqu'à la relance du timer
while time=TEMPS
GOTO 200
wend

If APPEL=1 Then call SP1
If APPEL=2 Then call SP2
If APPEL=3 Then call SP3
If APPEL=4 Then call SP4
200 end sub

Je pense que la solutio est relativement simple et élégante.
Ouf j'y suis arrivé.

Merci NHENRY.
0

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

Posez votre question
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
25 févr. 2011 à 09:20
Bonjour,

"Je pense que la solution est relativement simple et élégante. "
Rien que le fait de voir un "goto", tu devrais retirer le "élégante".

while time=TEMPS
GOTO 200
wend

est équivalent à :
if time=TEMPS then
GOTO 200
end if

Dans ton cas, le 200 menant à la fin de ta sub, l'instruction
Exit Sub
me semble plus approprié qu'un horrible GOTO.

De façon générale, GOTO est à bannir de VB6 (tout comme de VB.NET), car sauf cas très particuliers, il peut être remplacer par une instruction plus lisible, fiable et évitant les problèmes d'exécution.
Le code à base de GOTO arrive couramment à un code spaghetti.

0
JEANJON38 Messages postés 9 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 5 mai 2011
25 févr. 2011 à 12:05
Bonjour,

Mea culpa, je corrige de suite.
Les vieilles habitudes sont difficiles à perdre.

Par contre un petit conseil:

Dans ce cas on scrute en parmanence.
while time=TEMPS
GOTO 200
wend

Alors que dans ce cas on ne scrute qu'une fois.
( j'ai fais un essai avec if then et ce n'était pas fiable.
est équivalent à :
if time=TEMPS then
GOTO 200
end if

Peux tu confirmer s'il te plait ?
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
25 févr. 2011 à 12:14
Bonjour,

Les 2 structures sont équivalentes, car avec :
while time=TEMPS
GOTO 200
wend

2 cas :
Soit time<>TEMPS, au quel cas, tu ne passe pas dans le corps de ton While
Soit time=TEMPS, et là tu pars en 200 sans passer par le Wend.

Ensuite, je blocage éventuel, peut être sur les effets de bord si time ou TEMPS contiennent des fractions de secondes.

Je ne comprend pas pourquoi tu considère que dans ce cas If/Then n'est pas fiable.

0
JEANJON38 Messages postés 9 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 5 mai 2011
25 févr. 2011 à 13:24
Bonjour

Pout moi la boucle while wend tourne sur elle même sans trouver d'issue tant que le timer ne s'incrémente pas.
Tandisque if then ne vérifie qu'une seule fois la condition. ce qui effectivement revient au même.
j'avais fais l'essai sans succès mais il me semble que j'avais une autre structure de programme. Ceci expliquant cela.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
25 févr. 2011 à 13:30
Bonjour,

En effet, la boucle fonctionnerait si il y avait pas de Goto ou Exit au milieu.
essayes avec DoEvents (je te le déconseille quand même, ça pompe à mort sur le proc et ralenti toutes les autres applis)

0
JEANJON38 Messages postés 9 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 5 mai 2011
28 févr. 2011 à 10:03
Bonjour,

Ca fonctionne à merveille comme cela. Merci je vais maintenant régler les problèmes annexes.

Merci encore.
0
Rejoignez-nous