Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Scarsa efficienza di InternetReadFile rispetto a IE 6.0

Che magari sara' anche normale che il bestione internet explorer 6.0 riesca
a scaricare piu' velocemente un file che non usando le funzioni
InternetReadFile e soci, pero' a me pare eccessiva la differenza di
prestazione, quasi due volte piu' lento con vb e InternetReadFile.
Al che mi chiedo se non c'e' qualche impostazione sbagliata, magari nella
dimensione del buffer, oppure qualche trucchetto che non conosco per
migliorare l'efficienza complessiva dello scaricamento.
Questa che segue e' la funzione che uso per scaricare file da internet con
un programma vb.
Facendo diverse prove e' risultato che con questa funzione impiego circa il
doppio che con internet explorer a scaricare un dato file, sempre lo stesso
e nella stessa fascia oraria (si sa che il traffico a volte cambia le carte
in tavola).
Mi sembra eccessivo.
Fra l'altro "visivamente" appare evidente che con vb il problema e' che la
connessione ha tempi di latenza molto piu' alti, ossia i monitorini sulla
tray bar si accendono e si spengono con intervalli di circa mezzo secondo,
mentre IE risce a tenerli costantemente accesi.
Come fa? :-o
Questa e' la funzione:
Private Function DownloadUrlFile(IndirizzoUrl As String, _
        FileOutput As String) As Boolean
Dim hOpen As Long
Dim hOpenUrl As Long
Dim bRet As Boolean
Dim BufferDati As String * 512
Dim sBuffer As String
Dim NF As Integer
Dim HConnessione As Long
Dim SizeFile As Long
Dim LenFile As Long
Dim RetVal As Boolean
Dim SizeNow As Long
Dim IndiceHeader As Long
Dim StartTime As Long
Dim TimeNow As Long
Dim Testo As String
Dim Var1 As Double
Dim Var2 As Double
Dim BufferErrore As String * 512
Dim LenBufErr As Long
Dim CodiceErrore As Long
On Error GoTo GetSourceErr
Dim NumberoByteLetti  As Long
TestStop = False
Me.Label_Info.Caption = "In attesa di responso dal server per scaricare " &
SoloNomeUrl(IndirizzoUrl)
Me.Label_Info.Refresh
Me.Label_Info.Parent.Refresh
hOpen = InternetOpen("VB OpenUrl", _
                INTERNET_OPEN_TYPE_PRECONFIG, _
                vbNullString, vbNullString, 0)
Me.Label_Info.Parent.Refresh
hOpenUrl = InternetOpenUrl(hOpen, IndirizzoUrl, _
            vbNullString, 0, _
            INTERNET_FLAG_RELOAD, 0)
Me.Label_Info.Parent.Refresh
LenFile = 4
IndiceHeader = 0
SizeFile = 0
Call HttpQueryInfo(hOpenUrl, _
        HTTP_QUERY_CONTENT_LENGTH Or _
        HTTP_QUERY_FLAG_NUMBER, _
        SizeFile, LenFile, IndiceHeader)
NF = FreeFile
Open FileOutput For Binary Access Write As #NF
SizeNow = 0
StartTime = GetTickCount
Do
    If (TestStop = True) Then
        bRet = False
        Exit Do
    End If
    DoEvents
    BufferDati = vbNullString
    bRet = InternetReadFile(hOpenUrl, _
                BufferDati, _
                Len(BufferDati), _
                NumberoByteLetti)
    Put #NF, , Left$(BufferDati, NumberoByteLetti)
    SizeNow = SizeNow + NumberoByteLetti
    TimeNow = GetTickCount() - StartTime
    'visualizzare statistiche
    If (SizeFile <> 0) Then
        Call MostraPercentuale(Me.ProgressBar1, SizeFile, SizeNow)
        Testo = "Download " & SoloNomeUrl(IndirizzoUrl) & " (" & _
            FormattaDimensione(SizeNow) & " / " & _
            FormattaDimensione(SizeFile) & ")"
        'calcolare tempo rimasto
        TimeNow = TimeNow \ 1000
        Var1 = SizeFile
        Var2 = SizeNow
        Var1 = Var1 / Var2
        Var2 = TimeNow
        Var1 = Var1 * Var2
        'in var1 c'e' tempo totale previsto per il download
        'togliendo tempo gia' trascorso si dovrebbe
        'ottenere tempo rimanente
        Var1 = Var1 - TimeNow
        Testo = Testo & " - Rimangono = " & _
                Format(CStr(Var1 \ 60), "00") & "' " & _
                Format(CStr(Var1 Mod 60), "00") & Chr(34) & _
                " - Trascorsi = " & _
                Format(CStr(TimeNow \ 60), "00") & "' " & _
                Format(CStr(TimeNow Mod 60), "00") & Chr(34)
        Me.Label_Info.Caption = Testo
        Me.Label_Info.Refresh
    Else
        Me.Label_Info.Caption = "Scaricati " & _
                FormattaDimensione(SizeNow)
        Me.Label_Info.Refresh
    End If
Loop While (NumberoByteLetti > 0)
Close #NF
If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
If hOpen <> 0 Then InternetCloseHandle (hOpen)
DownloadUrlFile = bRet
Exit Function
GetSourceErr:
    Close #NF
    If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
    If hOpen <> 0 Then InternetCloseHandle (hOpen)
    DownloadUrlFile = False
End Function

 InternetReadFile e soci, pero' a me pare eccessiva la differenza di
[ecc. ecc.]
Ma mi spieghi cosa devi fare? scaricare un file o una pagina html o qlk da
internet?
E usi tutto questo codice?
ci vorranno (a braccio) si e no 7 righe...
Ma forse hai bisogno di qlk di più difficile da fare, non so. Magari
scarichi... boh? via HTTP si scaricano praticamente solo file (escludendo i
casi che inducono all'errore di pensare che un web service su http sia un
vero web service anche se non c'è SOAP sotto, ma questo è un errore classico
e lo scarto di base)...
Quindi provo:
    Dim I as Long
    Dim FF as Long
    Dim mh As MSXML.XMLHTTP
    Set mh = New MSXML.XMLHTTP
    mh.open "GET", "
http://www.urlsito.boh/chescaricostasera/questo.qui
",
False
    mh.send ""
    FF=FreeFile
    Open "C:\hoscaricato.boh" for Binary as #FF
    Put #FF,,mh.responseBody
    Close FF
    Set mh=nothing
Non sara' il massimo della vita, dell'efficenza della pulizia e del
controllo d'errore, ma direi che ad occhio e croce ci siamo...
O sbaglio?
Azz, avevo detto 7 e sono otto! (escludendo le dim). Incredibile, sto
invecchiando.
D.