JEANJON38
Messages postés9Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention 5 mai 2011
-
23 févr. 2011 à 20:05
JEANJON38
Messages postés9Date d'inscriptionmardi 13 novembre 2007StatutMembreDerniè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é.
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 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.
JEANJON38
Messages postés9Date d'inscriptionmardi 13 novembre 2007StatutMembreDerniè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.
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 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.
JEANJON38
Messages postés9Date d'inscriptionmardi 13 novembre 2007StatutMembreDerniè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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 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.
JEANJON38
Messages postés9Date d'inscriptionmardi 13 novembre 2007StatutMembreDerniè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
JEANJON38
Messages postés9Date d'inscriptionmardi 13 novembre 2007StatutMembreDerniè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.
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 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)