cs_Morinaux
Messages postés34Date d'inscriptionmercredi 19 novembre 2003StatutMembreDernière intervention16 mai 2009
-
5 août 2007 à 00:43
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
6 août 2007 à 09:39
Bonjour,
J'ai déjà créé un programme qui permet de générer des fichiers de taille X mais le temps de création du fichier devient vite très longue si on dépasse le mo.
C'est normal que la procedure est longue puisque je lui demande d'insérer dans un fichier X caractères et que dès que la taille correspont à celle souhaitée, il arrète.
Y a-t'il un moyen d'optimiser ce code ? Pour le rendre plus rapide ? Et peut être plus précis, je sait pas ?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 5 août 2007 à 02:42
Salut
FSO n'a pas la réputation d'être rapide. Utilisez plutôt les fonctions purement VB :
Private Sub Command2_Click()
Dim i As Long
Dim Size As String
Dim ff As Long
Dim Tableau(1023) As Byte ' Le premier index est 0
' Prépare le tableau de 1024 caractères "1"
ff = Asc("1")
For i = 0 To 1023
Tableau(i) = ff
Next i
' Ecrit x fois le tableau de 1024 bytes
ff = FreeFile
Open Path.Text For Binary Access Write As #ff
For i = 1 To Val(Taille.Text)
Put #ff, , Tableau
pb.Value = pb.Value + 1024
Next i
Close #ff
DoEvents
pb.Max = Val(Taille.Text) * 1024
Size = Round(FileLen(Path.Text) / 1024, 2)
If Size > 1024 Then
Size = Round(Size / 1024, 2) & " Mo."
Else
Size = Size & " Ko."
End If
MsgBox "Procédure terminée, le fichier fait " & Size
End Sub
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Morinaux
Messages postés34Date d'inscriptionmercredi 19 novembre 2003StatutMembreDernière intervention16 mai 20091 5 août 2007 à 01:11
Oui pas bête, le voici :
Private Sub Command2_Click()
Set FSys = CreateObject("Scripting.FileSystemObject")
Set MonFic = FSys.CreateTextFile(Path.Text)
Dim i As Long
Dim Size As String
pb.Max = Taille.Text * 1024
For i = 1 To Taille.Text * 1024
With MonFic
.write "1"
End With
pb.Value = pb.Value + 1
Next i
Size = Round(FileLen(Path.Text) / 1024, 2)
If Size > 1024 Then
Size = Round(Size / 1024, 2) & " Mo."
Else: Size = Size & " Ko."
End If
MsgBox "Procédure terminée, le fichier fait " & Size
End Sub
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 5 août 2007 à 08:30
je sais pas ce qui est le mieux : utiliser des "API externes" qui sont standard dans Windows, ou utiliser des "ocx externes" eux aussi standards dans Windows, mais plus lents...
cs_Morinaux
Messages postés34Date d'inscriptionmercredi 19 novembre 2003StatutMembreDernière intervention16 mai 20091 5 août 2007 à 11:52
Wouah !
Jack, ta méthode est impeccable, 1 mo généré en 0,1 seconde.
En plus c'est tu n'utilises pas d'ocx ou d'api (bien si l'on veut partager son programme et que l'autre personne n'a que vb6fr.dll).
.Donc pour répondre à BruNews, SetFilePointer est aussi une API, certes les API sont (beaucoup) plus rapide que les OCX mais cela n'a pas d'égal face à la méthode de Jack (performances, légèreté, optimisation, ...).
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 5 août 2007 à 12:58
"Cela n'a pas d'égal"... niveau performances, légéreté et optimisation, je dirais plutôt que les API n'ont pas d'égal : quoi de plus rapide qu'un appel vers un fonction système ? Un appel vers une fonction VB interprêté qui fait au final cet appel système ?
Je vois vraiment pas pourquoi les API te rebuttent tant morinaux ! Faut savoir que toutes les fonctions VB ne font qu'appel aux API au final... Sauf que ca passe entre temps dans l'interprêteur VB, donc autant les appeler directement dans le code, c'est bien plus rapide ! (VB n'étant pas très fort pour tout ce qui est entrée/Sortie !)