[Excel/VBA] Problème temporisation dans simulation
cs_nico39
Messages postés56Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention 4 octobre 2006
-
2 oct. 2006 à 11:04
cs_nico39
Messages postés56Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention 4 octobre 2006
-
4 oct. 2006 à 16:39
Bonjour!
Je suis en train de programmer une petite simulation sous Excel 2003, en VBA. Il s'agit de faire tourner simultanément plusieurs machines fonctionnant à différentes vitesses, afin de voir la répartition des produits finis en un temps donné.
Concrètement, j'utlise une série de 10 ProgressBars, que je place dans une boucle temporisée par une fonction Sleep 200 (=0,2s), afin de les incrémenter rapidement.
Je suis tombé sur quelques problèmes:
- le premier concerne la précision temporelle. J'utilisais jusque-là la fonction Sleep dans ma boucle afin de temporiser mon ensemble et que cela paraisse "simultané". Mais je me suis apercu que les temps de fonctionnement programmés pour chaque machine n'étaient pas respectés à l'exécution de la simulation. Il s'est avéré que le temps d'exécution des instructions dans ma boucle n'est pas négligeable par rapport au temps d'arrêt de ma fonction Sleep, et donc toutes les machines simulées mettent alors plus de temps que prévus. Il semble donc que je devrais changer de stratégie de temporisation et déclencher ma boucle toutes les 0,2s par un Timer ou qqchose de ressemblant.
Est-ce que quelqu'un aurait une idée pour faire un Timer assez précis (précision: 10ms) ? Ou alors une autre stratégie de temporisation à me proposer ?
Quelqu'un aurait-il aussi une autre stratégie pour simuler plusieurs processus "simultanés" ?
Je précise que je travaille sous VBA, et que je ne peux pas lire les fichiers VB, VB6,... que j'ai pu trouvé sur le forum.
Je précise également que je travaille directement sur les feuilles Excel et non sur UserForms (questions de place).
J'espère que mes explications sont assez claires et compréhensibles, et je vous remercie d'avance pour toutes vos suggestions.
cs_nico39
Messages postés56Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention 4 octobre 2006 4 oct. 2006 à 16:39
Salut MPi,
Merci de ta réponse.
Je me suis renseigné sur l'API GetTickCount. Il est vraiment plus précis que Timer, mais il consomme pas mal de ressources système par rapport à l'API Sleep (confirmé par plusieurs codes trouvés sur le site): en effet, cela revient à regarder sans cesse la montre et agir quand elle atteint une certaine valeur.
C'est vrai que c'est le principe que je cherche (exécuter une procédure toutes les xxx ms), mais, comme il dépend beaucoup des ressources système, si d'autres logiciels tournent sur ton PC, mon programme sous VBA va ramer un peu plus, d'où perte de précision.
L'idéal serait un truc du genre:
temps_ref = GetTickCount2 '= une API qui est similaire à GetTickCount, mais moins gourmande en ressources système
Do Until (une condition propre à ton programme)
If GetTickCount2 = temps_ref + periode Then
temps_ref = GetTickCount2
(Exécution de ta procédure)
End if
Loop
Bien sûr, si l'API consomme très peu de ressource système, ce serait encore mieux...
Je suis ouvert à toutes suggestions. Merci d'avance