[Excel/VBA] Problème temporisation dans simulation

cs_nico39 Messages postés 56 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 4 octobre 2006 - 2 oct. 2006 à 11:04
cs_nico39 Messages postés 56 Date d'inscription vendredi 4 mars 2005 Statut Membre Derniè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.

Nicolas.



Amateurement vôtre... 

2 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
2 oct. 2006 à 22:52
Salut,

pas simple de travailler avec des timers sous Excel...


Peut-être pourrais-tu regarder du côté de Timer

    Dim Temps As Single

   

    Temps = Timer

    Do Until Timer >= Temps + 0.2

    Loop

    MsgBox Timer - Temps  'résultat chez moi :  0,1992188


Ce n'est pas ce qu'il y a de plus précis, mais je pense que ça donne un résultat pas pire.

Autrement, il y a l'API GetTickCount, je pense, qui pourrait être
utilisée, mais je n'ai pas d'exemple. Tu pourras sûrement en trouver
sur ce site.


Et ne pas oublier DoEvents s'il y a différents processus qui fonctionnent en même temps.

MPi
0
cs_nico39 Messages postés 56 Date d'inscription vendredi 4 mars 2005 Statut Membre Derniè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

Amateurement vôtre... 
0
Rejoignez-nous