cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013
-
24 août 2007 à 18:25
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 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é?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.