Fonctionne en "interprété" et boucle en "compilé"

cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013 - 24 août 2007 à 18:25
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 24 août 2007 à 21:06
Bonjour,
Je m'arrache les cheveux là-dessus depuis plusieurs jours!
Quelqu'un pourrait-il me dire pourquoi cette routine fonctionne en "interprété" et boucle en "compilé"?



Private Sub Decompress()
  'pour décompresser des fichiers .tar.bz2:
  For i = 0 To Dir1.ListCount - 1
    a$ = Dir1.List(i)
    b$ = App.Path + "\toto.tar.bz2"
    c$ = App.Path + "" + Right$(a$, 10) + ".dxf"
    d$ = App.Path + "\toto.tar"
    If Existo(b$) Then Kill b$
    FileCopy a$ + "" + Right$(a$, 18) + ".tar.bz2", b$    k 0: While Not Exist(b$): k k + 1: Wend
    ret = Shell("bzip2.exe -d -k toto.tar.bz2", 0)    k 0: While Not Exist("toto.tar"): k k + 1: Wend
    ret = Shell("tar.exe -xf toto.tar", 0)    k 0: While Not Exist(c$): k k + 1: Wend
    Do
      On Error Resume Next
      Kill "toto.tar.bz2"
      If Err.Number = 0 Then Exit Do
    Loop
    Do
      On Error Resume Next
      Kill "toto.tar"
      If Err.Number = 0 Then Exit Do
    Loop
    On Error GoTo 0    k 0: While Not Exist(c$): k k + 1: Wend
  Next i
End Sub

4 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 août 2007 à 18:35
Déjà dans tes boucles, tu peux remplacer tes k= k+1 qui bouffent du temps CPU et qui ne servent à rien, par des DoEvents.

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
24 août 2007 à 20:00
Salut
C'est ce que j'allais dire : Ajoute au moins un DoEvents dans ta boucle sinon le système n'a pas le temps d'agir.
A chaque fois que tu fais une action du genre Kill, ajoute un DoEvents ou une boucle d'attente pour que le système ait le temps d'agir et surtout de rafraichir son cache.
Voir aussi http://www.vbfrance.com/codes/TUTO-TECHNIQUE-POUR-ATTENDRE_21180.aspx

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
24 août 2007 à 20:54
Vos reflexions, Jack et Casy, sont tout à fait justifiées et judicieuses.
Néanmoins elles n'expliquent pas pourquoi cette routine marche sans problème en mode interprété et boucle régulièrement en mode compilé. Serait-ce en raison du temps de traitement accéléré en mode compilé?
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 août 2007 à 21:06
Letemps de traitement accéléré en compilé ???

J'aurais plutot dis le temps de traitement fortement ralentie en deboguage dans l'IDE. Effectivement cela vient de là. En debogage, entre chaque instruction, l'IDE reprend la main, et laisse aussi la main au système pour faire son travail. Ce qu'il fait que les instructions asynchrones et longues dans ton code ont le temps de se réaliser.

En mode compilé, il n'y a personne pour prendre la main, c'est ton code qui la garde. Alors si tu fais une boucle bloquante, tout le temps processeur va erte pris pour executer cette boucle et les autres instructions précédentes non totalement réalisées ne se termineront pas. Et quand la boucle est justement une attente de la fin des ces instructions, c'est le chat qui se mord la queue. d'ou le DoEvents pour rendre la main au système qu'il puissse terminer ce qu'il a à faire.

Par principe, une boucle ne devrait jamais etre bloquante. Si c'est une boucle courte qui fait du traitement, soit. Mais pour une boucle longue, qui plus est une boucle d'attente, elle ne doit surtout pas etre bloquante.

Une boucle ne doit non plus jamais etre sans fin. Il faut toujours veiller à ce qu'il y ait une condition de sortie.

C'est les bases même de l'informatique.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
Rejoignez-nous