Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [VB6] Sincronizzazione Contollo Webbrowser

    Il mio problema è il seguente:

    ho la semplice necessità , attraverso il metodo "navigate" del controllo webbrowser, di scaricare dei documenti web e di salvare il contenuto html in un file. Però pur impostando il codice nella sequenza corretta( visualizza -> scarica-> salva) il compilatore sembra che ottimizzi l'esecuzione, accedendo alla istruzione di salva su file prima ancora di avere completato il download, mentre in debug tracing esegue le istruzioni nella corretta sequenza. A quanto pare VB (erroneamente) ottimizza il codice eseguendo prima le istruzioni più veloci e quindi sembra che vi sia un problema di sincronizzazione. Fossi in Java avrei risolto il problema con i threads ma in VB non so se si può fare o se è commplicato farlo. Neanche la gestione degli eventi mi viene in soccorso..non so più che pesci prendere!!
    lysyd

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Cioe' ? Che codice hai usato?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Tieni conto che il metodo Navigate non aspetta che la pagina si sia caricata, semplicemente avvia il download della pagina. Puoi sapere quando la pagina è stata completamente caricata intercettando l'evento NavigateComplete2.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Originariamente inviato da oregon
    Cioe' ? Che codice hai usato?

    Il codice è

    For i = 0 To 9
    matr = matricola(i)
    cogn = cognome(i)
    nom = nome(i)
    dec = 3
    webbrowser1.navigate "http://10.188.44.107:8080/Decadale/d?matricola=" & matr &_
    &nome=" & nom & "&cognome=" & cogn & "&decade=" & dec & "&cmd=d"
    ContenutoConHtml = webbrowser1.document.documentElement.outerHTML
    RichTextBox1.Text = ContenutoConHtml
    WriteFile RichTextBox1.Text, "C:\prova.doc"
    Next i

    L'istruzione writefile viene eseguita prima che la pagina web venga scaricata. Anche utilizzando la gestione eventi in alternativa nel seguente modo:

    Private Sub WEB_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
    if paginaCaricata=true ' diventa true dopo che ha scaricato ogni pagina
    WriteFile RichTextBox1.Text, "C:\prova.doc"
    PaginaCaricata = False
    webbrowser1.Refresh
    End If
    End Sub


    il risultato non cambia perchè la varibile paginaCaricata VIENE ESEGUITA PRIMA del download...
    lysyd

  5. #5
    Ma se devi scaricare solo il codice della pagina ti basta usare la API URLDownloadToFile. Con questa funzione poi la faccenda diventa ancora più semplice: inserisci il codice che segue in un modulo separato:
    codice:
    Option Explicit
    Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
    Public Sub DownloadURL(ByVal URL As String, ByVal DestinationFile As String)
        Dim ret As Long
        ret = URLDownloadToFile(0, URL, DestinationFile, 0, 0)
        If ret <> 0 Then
            Err.Raise IIf(ret = &H8007000E, 7, 51), "DownloadURL", "Impossibile scaricare l'URL """ & URL & """ in """ & DestinationFile & """." & vbCrLf & "Codice di errore di URLDownloadToFile: " & LTrim(CStr(ret)) & "."
        End If
    End Sub
    ; a questo punto per scaricare un file ti basterà scrivere
    codice:
    DownloadURL "http://www.tuosito.it/index.html", "c:\percorso\index.html"
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Grazie MItaly, la funzione DownloadURL scarica il file correttamente, ma il problema resta, infatti anche "downloadURL" NON è sincronizzata poichè non aspetta il download della pagina per cui scarica su file un html vuoto.

    Ad esempio:

    For i = 1 to fineElencoPagineWeb
    webbrowser1.navigate paginaweb(i)
    downloadURL paginaweb(i), miopercorso\miofile(i).html
    next i

    esegue il ciclo, ed alla fine il browser visualizza solo paginaweb(fineElencoPagineWeb) ed ha scaricato solo miopercorso\miofile(1).html vuoto.

    Inserendo downloadURL all' interno della routine che gestisce l'evento webbrowser1_NavigateComplete2 il risultato non cambia....

    temo che VB sia inadatto a gestire un problema del genere...che ne pensate?
    lysyd

  7. #7
    DownloadURL è sincronizzata. Togli il WebBrowser, il RichTextBox e relativi eventi, ed inserisci al posto del codice che hai postato questo codice:
    codice:
    For i = 0 To 9
        matr = matricola(i)
        cogn = cognome(i)
        nom = nome(i)
        dec = 3
        DownloadURL "http://10.188.44.107:8080/Decadale/d?matricola=" & matr & "&nome=" & nom & "&cognome=" & cogn & "&decade=" & dec & "&cmd=d", _
                    "c:\percorso\" & matr & "_" & cogn & "_" & nom & ".htm"
    Next
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Grazie ancora MItaly,

    effettivamente il problema della sincronizzazione è risolto e il codice funziona , ora devo solo risolvere un piccolo problema relativamente all'index page a cui si accede con usr e psw , ma penso di poterlo gestire inizialmente con webrowser, anche perchè la funzione API downloadurl credo gestisca solo il download sincronizzato ma non la parte visuale. A meno che non intercetto la request string da inviare direttamente al server come url senza passare per la form della pagina web.. non so se è semplice perchè il testo sulla barra di stato è molto veloce e non si riesce a leggere... pensate sia semplice?


    lysyd

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.