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

Signaler
Messages postés
252
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
29 juin 2013
-
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
-
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

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
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)
Messages postés
252
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
29 juin 2013

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é?
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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