|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
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
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
Grazie come sempre a tutti per l'aiuto. (immagino sia un errore estremamente banale, ma non ci arrivo proprio! he he) |
|
|
|
|
|
#2 |
|
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. |
|
|
|
|
|
#3 |
|
Senior Member
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 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
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) 4. EseguiParsing ed EstraiDati sono la stessa Function ? 5. Codice:
Dim filename As String = aFileName 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
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
Codice:
TextBox2.Text = TextBox2.Text + "Valore ottenuto: " + strMyString + vbCrLf |
|
|
|
|
|
#4 |
|
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
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
Ultima modifica di Diablo-IT : 24-06-2009 alle 18:19. |
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Quote:
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
|
||
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Sep 2007
Messaggi: 312
|
Quote:
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:
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. |
||
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
In ogni caso se WebBrowser non è proprio strettamente necessario potevi risolvere anche solo con un HtmlDocument, senza bisogno di componenti UI... |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:44.




















