Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-06-2009, 17:30   #1
Diablo-IT
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 312
[VB .NET] Strano BUG con WebBrowserControl

Ciao a tutti, sono ormai un paio d'ore che sto impazzendo con un bug assurdo in una semplicissima applicazione VB .net, che non utilizza altro che alcuni comandi textbox, button, e un WebBrowser.

Poche centinaia di righe di codice di una banalita' assurda, eppure ci sto uscendo pazzo...

Porzione di codice funzionante:
Codice:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
          WebBrowser1.Navigate(percorso+nomefile)
    End Sub
'_______________________________________________________________
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim htmle As HtmlElement
        ' dichiarazione altre variabili ecc

        i = 0
        For Each htmle In WebBrowser1.Document.GetElementsByTagName("td")
            If i = 0 
               ' codice per parsing html, ad esempio:
               strMyString = htmle.InnerText
                'MessageBox.Show(strMyString)
                TextBox2.Text = TextBox2.Text + "Valore ottenuto: " + strMyString + vbCrLf                
i = i + 1
            Else
                Exit For
            End If
        Next
In pratica se carico attraverso il "button1" nel "webbrowser1" il file che mi interessa, e in seguito attraverso "button2" eseguo il parsing di cui sopra, tutto funziona.

Se invece unisco il tutto in un unica funzione richiamata da un comando button (evento onclick ovviamente), mi carica si il file nel comando webbrowser, ma poi mi esce dalla funzione saltando tutto il resto, oppure mi genera uno stackoverflow o altri errori a random. Ecco il codice incriminato:

Codice:
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim aFileName As String = ""
        Dim Y As Integer = 0
        Do
        aFileName = ListBox1.Items.Item(Y)
        Call EseguiParsing(aFileName)
        Y += 1
        Loop Until Y = ListBox1.Items.Count (diverse centinaia di items, composti da percorso+nomefile per ogni item della listbox)
    End Sub
'______________________________________________________________
    Public Function EstraiDati(ByVal aFileName As String) As Boolean
        Dim filename As String = aFileName
        Dim htmle As HtmlElement
        ' dichiarazione altre variabili ecc

        i = 0
        For Each htmle In WebBrowser1.Document.GetElementsByTagName("td")
            If i = 0 
               ' codice per parsing html, ad esempio:
               strMyString = htmle.InnerText
                TextBox2.Text = TextBox2.Text + "Valore ottenuto: " + strMyString + vbCrLf  
                i = i + 1
            Else
                Exit For
            End If
        Next
return true
end function
Dove cavolo sta l'errore? Supero la quantita' di caratteri massima ammissibile dalla textbox o cosa?
Grazie come sempre a tutti per l'aiuto.
(immagino sia un errore estremamente banale, ma non ci arrivo proprio! he he)
Diablo-IT è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2009, 18:46   #2
Diablo-IT
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 312
Ecco l'errore:

Managed Debugging Assistant 'DisconnectedContext' has detected a problem in '........... \bin\Debug\xxnomefilexx.vshost.exe'.
Additional Information: Contesto 0x1a19b0' disconnesso. Rilascio delle interfacce dal contesto corrente (0x1a1840) in corso... È possibile che si verifichino danni o la perdita di dati. Per evitare questo problema verificare che tutti i contesti/parametri restino attivi fino a quando l'applicazione avrà completato le operazioni con RuntimeCallableWrappers che rappresentano i componenti COM attivi al loro interno.
Diablo-IT è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2009, 21:23   #3
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Prima però diamo una sistemata a quel codice, ti prego !

1.
Codice:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Perchè Button1_Click ha l'Handles su Button2 ?

2. Perchè usare un Do Loop + contatore ? Perchè usare Call per le Function ?
Non sarebbe molto più semplice e compatto :
Codice:
        Dim aFileName As String = ""
        For Y As Integer = 0 To ListBox1.Items.Count - 1
            aFileName = ListBox1.Items(Y)
            Dim b As Boolean = EseguiParsing(aFileName)
        Next
Poi sfido che c'è gente che va in giro a dire che VB è prolisso !

3. Se EseguiParsing è una Function, significa che ha senso tenere traccia del valore di ritorno, perciò come già scritto :
Codice:
Dim b As Boolean = EseguiParsing(aFileName)
Se non interessa li valore di ritorno bastava una Sub.

4. EseguiParsing ed EstraiDati sono la stessa Function ?

5.
Codice:
Dim filename As String = aFileName
Superfluo, dato che aFileName è l'argomento non-Optional della Function.

6.
Codice:
        For Each htmle In WebBrowser1.Document.GetElementsByTagName("td")
            If i = 0 Then
                strMyString = htmle.InnerText
                TextBox2.Text = TextBox2.Text + "Valore ottenuto: " + strMyString + vbCrLf
                i = i + 1
            Else
                Exit For
            End If
        Next
Non capisco perchè fai un For Each + contatore i ( incrementandolo ), e poi, se i non è 0 > Exit For...
Se volevi estrarre solo il primo elemento trovato dal For Each, bastava :
Codice:
        For Each htmle In WebBrowser1.Document.GetElementsByTagName("td")
            strMyString = htmle.InnerText
            TextBox2.Text = TextBox2.Text + "Valore ottenuto: " + strMyString + vbCrLf
            Exit For
        Next
Però poi non mi spiego :
Codice:
TextBox2.Text = TextBox2.Text + "Valore ottenuto: " + strMyString + vbCrLf
Insomma, vedi di dare una bella chiarita al tutto che poi, la soluzione al problema salta fuori...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2009, 17:18   #4
Diablo-IT
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 312
Mi sa che ho fatto un po di casino con il copia/incolla... si vede che iniziavo ad esser parecchio fuso ieri pomeriggio!

Andiamo per ordine:

1) Mea culpa, ho riletto tutto prima di postare, e infatti ecco il risultato...

2) Ops... alla faccia del codice leggibile e pulito! Quando inizio a partire per la tangente riesco a complicar le cose piu' banali.

3) Di solito faccio direttamente "if chiamataFunzione then - else - end if" in base al buon esito (true) o no (false) della funzione. Dici che faccio male?

4) Si... scusa.

5) Mi pare di aver letto cosi' su un libro di F.Balena/MS Press dove consigliava di far cosi', e ho preso quest'abitudine.

6) Se non ti da problemi (mandami pure a quel paese quando vuoi he he, non vorrei aprofittarmi troppo della tua disponibilita'), posso contattarti tramite messaggio privato, cosi' ti spiego in maniera piu' chiara? Senno' qua salta fuori un mezzo romanzo (ormai ho detto che e' tutto pronto, e son nella m... per questa stupidaggine che non riesco a risolvere).

EDIT:

Cosi' funziona (ma non ha senso usar na roba cosi'!):
Codice:
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim aFileName As String = ""
        For Y As Integer = 0 To ListBox1.Items.Count - 1
            aFileName = ListBox1.Items(Y)
            MessageBox.Show(aFileName)
            apriHTML(aFileName)
            EseguiParsing()
        Next
    End Sub
Cosi' nada: (eppure e' lo stesso codice, a parte un messagebox in meno):

Codice:
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim aFileName As String = ""
        For Y As Integer = 0 To ListBox1.Items.Count - 1
            aFileName = ListBox1.Items(Y)
            apriHTML(aFileName)
            EseguiParsing()
        Next
    End Sub
Vado a studiarmi un po di msdn che c'e' qualcosa che non mi quadra!

Ultima modifica di Diablo-IT : 24-06-2009 alle 18:19.
Diablo-IT è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2009, 21:22   #5
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da Diablo-IT Guarda i messaggi
3) Di solito faccio direttamente "if chiamataFunzione then - else - end if" in base al buon esito (true) o no (false) della funzione. Dici che faccio male?
No, così è ok. Era quella Call su Function senza curarsi del valore di ritorno che non mi convinceva...

Quote:
Originariamente inviato da Diablo-IT Guarda i messaggi
5) Mi pare di aver letto cosi' su un libro di F.Balena/MS Press dove consigliava di far cosi', e ho preso quest'abitudine.
Se prevedi di eseguire successivi controlli e/o modifiche al parametro della Function, ha senso. Creare una nuova String che non fa altro che copiare il parametro mi pare superfluo.

Per il problema sul WebBrowser credo di aver capito. E' una questione di tempi. In pratica se fai un ciclo che carica N pagine web, devi tenere conto del fatto che, quando entra in gioco la EseguiParsing(), il WebBrowser1 con ogni probabilità non ha avuto il tempo di completare il caricamento, perciò il tentativo di leggere un document non ancora completato causa errori.
Considera che un For è una scheggia, in confronto al quale WebBrowser mentre carica è meno di una lumaca.

Prova questa soluzione, molto simile alla tua, in cui ad ogni ciclo, aspetto il caricamento completo, prima di esaminare il document corrente :

Codice:
Public Class Form1

    Private caricamentoCompletato As Boolean = False

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim aFileName As String = ""
        For Y As Integer = 0 To ListBox1.Items.Count - 1
            caricamentoCompletato = False
            aFileName = ListBox1.Items(Y)
            ListBox2.Items.Add("NUOVA PAGINA: " + aFileName)
            EseguiParsing(aFileName)
        Next

    End Sub

    Private Sub EseguiParsing(ByVal aFileName As String)

        WebBrowser1.Navigate(aFileName)
        While True
            System.Threading.Thread.Sleep(10)
            My.Application.DoEvents()
            If caricamentoCompletato = True Then Exit While
        End While
        Dim strMyString As String = ""
        For Each htmle As HtmlElement In WebBrowser1.Document.GetElementsByTagName("td")
            strMyString = htmle.InnerText
            ListBox2.Items.Add("Valore ottenuto: " + strMyString)
        Next
        ListBox2.Items.Add("")

    End Sub

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        caricamentoCompletato = True
    End Sub

End Class
Nel mio caso uso una ListBox ( ListBox2 ) per l'inserimento degli HtmlElement trovati...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2009, 04:38   #6
Diablo-IT
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 312
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Per il problema sul WebBrowser credo di aver capito. E' una questione di tempi.
E hai capito bene!
Nella fretta ho risolto con un codice simile al tuo, ma soltanto con uno sleep piu' lungo (senza controllare l'effettivo caricamento della pagina, almeno sulla macchina di test ha funzionato).
Subito corretto come mi hai suggerito, almeno ora son sicuro della stabilita'.

Quote:
Nel mio caso uso una ListBox ( ListBox2 ) per l'inserimento degli HtmlElement trovati...
Non ti preoccupare, almeno la visualizzazione/esportazione cel'ho fatta a scriverla senza combinar troppi casini.

Che dire, grazie di cuore, mi hai tolto da un bel pasticcio!
Ora che e' tutto risolto capisco di essermi perso per una stupidata, e nel tentativo di risolverla ho sporcato il codice in un modo assurdo, complicando ancora di piu' le cose.
Diablo-IT è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2009, 12:33   #7
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da Diablo-IT Guarda i messaggi
E hai capito bene!
Nella fretta ho risolto con un codice simile al tuo, ma soltanto con uno sleep piu' lungo (senza controllare l'effettivo caricamento della pagina, almeno sulla macchina di test ha funzionato).
Subito corretto come mi hai suggerito, almeno ora son sicuro della stabilita'.
Ha funzionato probabilmente perchè quella Sleep era sufficiente a consentire il completo caricamento... Ma meglio sempre controllare esplicitamente l'avvenuto completamento del document.
In ogni caso se WebBrowser non è proprio strettamente necessario potevi risolvere anche solo con un HtmlDocument, senza bisogno di componenti UI...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
ESA: rilevati 40 mila asteroidi vicino a...
La batteria salva fabbriche di EQORE ott...
SpaceX Starship: iniziati i test della t...
Datacenter IA nello spazio entro 5 anni,...
Telescopio spaziale James Webb: rilevato...
Ericsson Mobility Report: nel 2025 il 5G...
PLAI DEMO DAY: si chiude il secondo cicl...
Google rilascia Nano Banana Pro: il nuov...
ChatGPT si rinnova ancora: disponibile l...
Ring lancia super sconti di Black Friday...
Black Friday 2025: 450 euro di sconto su...
Tutte le offerte Blink in un unico posto...
OpenAI e Foxconn uniscono le forze per r...
Ricarica delle auto elettriche in 3 minu...
Lucid presenta Gravity Touring, il SUV e...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 02:44.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v