Oppure

Loading
30/01/09 20:27
eccomi a porre un nuovo quesito.....
sto' usando la funzione redim che mi incrementa la matrice di variabili, questo pero' mi carica lmemoria, questa funzione viene richiamata piu' volte in maniera ciclica, e le variabili allocate in memoria non vengono mai cancellate aumentando di continuo ed esaurendo la memria......
ci sarebbe il modo esaurito un ciclo di di far tornare la matrice di variabili alle dimensioni originali in modo che liberi la memoria, cosi' al prossimo utilizzo riparta da 0?
30/01/09 20:52
GrG
ma non puoi riscrivere sui dati precedenti?

mostra un esempio per capire meglio...
aaa
31/01/09 9:42
theprogrammer
Se usi la Redim per "incrementare" la memoria e' perche' hai bisogno di MAGGIORE memoria ...

Ma se non hai bisogno di MAGGIORE memoria, allora stai usando la Redim senza averne bisogno ...
aaa
31/01/09 11:37
Public Function GetMD5(sFile$) As String
    Dim hFile&, uBuffer() As Byte, lFileSize&, lBytesRead&, uMD5(lMD5Length) As Byte
    Dim i&, hCrypt&, hHash&, sMD5$
    
    'Get a handle to the file
    hFile = CreateFile(sFile, GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, ByVal 0&, ByVal 0&)
    
    'Check if file opened successfully
    If hFile > 0 Then
        'Get the file size
        lFileSize = GetFileSize(hFile, ByVal 0&)
    
        'File size must be greater than 0
        If lFileSize > 0 Then
            'Prepare the buffer
            ReDim uBuffer(lFileSize - 1)
            'Read the file
            If ReadFile(hFile, uBuffer(0), lFileSize, lBytesRead, ByVal 0&) <> 0 Then
                If lBytesRead <> lFileSize Then
                    ReDim Preserve uBuffer(lBytesRead - 1)
                End If
                
                'Acquire the context, create the hash, and hash the data
                If CryptAcquireContext(hCrypt, vbNullString, vbNullString, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) <> 0 Then
                    If CryptCreateHash(hCrypt, CALG_MD5, 0&, 0&, hHash) <> 0 Then
                        If CryptHashData(hHash, uBuffer(0), lBytesRead, ByVal 0&) <> 0 Then
                            If CryptGetHashParam(hHash, HP_HASHVAL, uMD5(0), lMD5Length, 0) <> 0 Then
                                'Build the MD5 string
                                For i = 0 To lMD5Length - 1
                                    sMD5 = sMD5 & (Right$("0" & Hex$(uMD5(i)), 2))
                                Next i
                            End If
                        End If

                        'Destroy the hash
                        CryptDestroyHash hHash
                    End If
                    
                    'Release the context
                    CryptReleaseContext hCrypt, 0
                End If
            End If
        End If
        
        'Close the handle to the file
        CloseHandle hFile
    End If
     
    'Convert to lower case
    GetMD5 = LCase$(sMD5)
End Function


non ho bisogno di incrementare la memoria, ma di incrementare la variabile " ubuffer() " che inevitabilmente occupa memoria, dovrei riuscire a svuotare la variabile alla fine della funzione.....
una variabile in vb si puo' svuotare usando il nothing....ma in questo caso non mi riesce di usarlo.....

se qualcuno ha qualche idea bene accetta.....
31/01/09 12:34
theprogrammer
Postato originariamente da muteblaster:
non ho bisogno di incrementare la memoria, ma di incrementare la variabile " ubuffer() " che inevitabilmente occupa memoria


Quindi, che differenza c'e' con quello che ti ho detto?

dovrei riuscire a svuotare la variabile alla fine della funzione.....


Non e' affatto necessario.

Quell'array di byte e' locale alla funzione.
Al termine della funzione, non esiste piu'.

una variabile in vb si puo' svuotare usando il nothing....


Non c'entra nulla ... il nothing non serve a "svuotare" nulla ma per distruggere per le istanze di una classe (per gli oggetti) ... non e' questo il caso.

ma in questo caso non mi riesce di usarlo.....


E infatti non c'entra nulla.

In conclusione, non devi fare niente.
Ultima modifica effettuata da theprogrammer 31/01/09 12:35
aaa
31/01/09 16:12
se io faccio lo hash di un singolo file non ho problemi , ma se lo faccio di molti file , per esempio di una intera diretory mi da errore di memoria esaurita.....

31/01/09 16:46
theprogrammer
Ogni volta che la funzione termina, la memoria viene restituita.

L'errore che hai e' solo perche' si sta tentando di trattare un file molto grande e non e' possibile allocare tutta la memoria.

Quando hai quell'errore, prova a vedere quale file stava trattando e quanto era grande.
aaa
31/01/09 17:53
GrG
come dice theprogrammer alla fine della funzione ubuffer (o come si kiamava) viene distrutto automaticamente...mi pare ke la funzione accetti un solo file alla volta...quindi come fai a "dargli" un'intera directory?
io penso che in un button ci metti tipo un ciclo magari anche crazie ai componente filebox e dirbox però se prendi un file alla volta significa (come dice theprogrammer) che richiami la funzione, ubuffer si riempie, la funzione finisce, la variabile ubuffer smette di esistere xk viene distrutta. Quindi non è il problema che in ubuffer si accumula sempre + roba perchè ogni volta parte da 0. Quindi si tratta di un file troppo grande da aprire e come giustamente dice theprogrammer dicci (quando ti da l'errore) a che file stava soprattutto alle dimensioni del file a cui si è fermato...
aaa