Newsgroup: it.comp.lang.visual-basic
Titolo: Come posso velocizzare questo codice?

Vi riporto questo codice che apre un file... però ci mette moltissimo
tempo e devo aprire un file di 4 MB... ci mette un eternità... cosa
sbaglio??
Dim sContents As String, sByte As Byte, i As Long
Dim sChar As String, sTempContents As String
Dim Annulla As Boolean
__________________
Annulla = False
On Error GoTo Done
Open Database For Binary As 1
DoEvents
Do While Not EOF(1)
    Get 1, , sByte
    If sByte >= 32 And sByte <= 128 Then
        sChar = Chr(sByte)
    Else
        sChar = " "
    End If
    sTempContents = sTempContents & " " & sChar
    i = i + 1
    If i Mod 100 = 99 Then
        progressbar.Value = Int((100 * (i + 1)) / 4471450)
        lblPerc.Caption = Int(progressbar.Value) & "%"
        DoEvents
        sContents = sContents & " " & sTempContents
        sTempContents = ""
    End If
    If Annulla Then
        lblStatus.Caption = "Caricamento Annullato!"
        cmdOK.Visible = True
        lblPerc.Visible = False
        progressbar.Visible = False
        Exit Do
    End If
Loop
Done:
If Annulla Then
    frmMain.Text1.Text = sContents
ElseIf Err.Description <> 0 Then
    MsgBox "Errore: " & Err.Description
Else
    frmMain.Text1.Text = sContents
    cmdOK.Visible = True
    lblPerc.Visible = False
    progressbar.Visible = False
    lblStatus.Caption = "Database Caricato!"
    On Error Resume Next
    Close 1
    Err.Clear
End If

     i = i + 1
 ReDim Preserve str(i)
    str(i) = sChar
'Velocizzi di molto.
giuseppeD


 sbaglio??
[SNIP]
Come gia' detto da giuseppe, la concatenazione di stringhe e' quello che
addormenta la tua routine; con questa mole di dati devi limitarla il piu'
possibile.
Se lavori con .NET vale il suggerimento di usere uno StringBuilder, in VB6
invece puoi fare qualcosa di analogo usanfo un buffer predimensionato e
l'istruzione Mid al posto della concatenazione... qualcosa del genere:
Dim sContents As String, sByte As Byte, i As Long
Dim sChar As String
Dim Annulla As Boolean
On Error GoTo Done
Open Database For Binary As 1
'lavoriamo con un buffer dimensionato a blocchi di 64Kb;
'qui e' inutile usare la seconda variabile sTempContents, e' stata tolta
sContents = Space(65536)
DoEvents
Do While Not EOF(1)
    Get 1, , sByte
    If sByte >= 32 And sByte <= 128 Then
        sChar = Chr(sByte)
    Else
        sChar = " "
    End If
    i = i + 1
    'aggiungiamo un nuovo blocco se abbiamo finito lo spazio
    If i >= Len(sContents) Then sContents = sContents & Space(65536)
    'inseriamo i caratteri nella posizione specificata
    Mid$(sContents, i, 2) = sChar & " "
    If i Mod 100 = 99 Then
        ProgressBar.Value = Int((100 * (i + 1)) / 4471450)
        lblPerc.Caption = Int(ProgressBar.Value) & "%"
        DoEvents
    End If
    '[...]
il resto come prima, a parte qualche errorino qua e la ;-); al termine del
ciclo assegni il risultato eliminando gli spazi superflui con
Text1.Text = RTrim(sContents)
Puo' darsi ci sia qualche aggiustamento da fare ma il concetto e' questo, ed
e' nettamente piu' veloce.
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

     If sByte >= 32 And sByte <= 128 Then
Perchè 128 e no 126 ?
giuseppeD

GRAZIE!!!