2010-01-11 3 views
0

Je Fill Private Sub(), qui im ​​essayant d'appeler à partir button1, sous forme deVB.net Simple multithreading

Dim t1 As System.Threading.Thread = New System.Threading.Thread(AddressOf Me.Fill) 

t1.Start() 

Cependant, quand je lance le programme rien ne se passe. Je clique sur le bouton plusieurs fois et la fonction n'est pas en cours d'exécution. Ce qui donne? La fonction Fill est essentiellement une sortie de html de IE dans une zone de texte, en exécutant regex et en sortie les résultats dans une zone de liste.

Quelqu'un peut-il m'aider à le faire fonctionner? J'apprécierais l'aide. EDIT: Ci-dessous, est la fonction de remplissage que j'essaie de travailler. La fonction elle-même fonctionne, quand je l'essaie sans multithreading. Mais pas avec ...

Private Sub Fill() 
    Try 
     For Each links In ListBox2.Items 
      Dim blah As Boolean = False 
      Do While blah = False 
       Application.DoEvents() 
       If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then 
        blah = True 
        WebBrowser1.Navigate(links) 
        Application.DoEvents() 
        Me.Refresh() 
        'OUTPUT THE REGEX IN RTB 
        Try 
         RichTextBox1.Text = WebBrowser1.Document.Body.OuterHtml 
         RichTextBox1.Update() 
         Application.DoEvents() 
         Me.Refresh() 
         'INTRODUCE REGEX 
         If CheckBox1.Checked = True Then 
          Dim R As New Regex("</H3>&lt;.*gt;") 
          For Each M As Match In R.Matches(RichTextBox1.Text) 
           Dim email As String = M.Value.Substring(9).Split("&;").GetValue(0).ToString 
           ListBox1.Items.Add(email) 
          Next 
         End If 
        Catch ex As Exception 
         Label1.Text = "Error recieved. Program will not stop" 
         Me.Refresh() 
        End Try 
        Application.DoEvents() 
        Me.Refresh() 
       End If 
      Loop 
     Next 
    Catch ex As Exception 

    End Try 
End Sub 
+1

Êtes-vous conscient de l'exigence du fil d'exécution de l'interface graphique/du fil de travail? –

+0

Voici un petit tutoriel sur le multi-threading dans VB.Net: http://chrishaas.wordpress.com/2009/06/25/creating-a-simple-multi-threaded-vb-net-application/ –

Répondre

0

Commencez par placer un point d'arrêt dans la méthode de remplissage. Je parie que ça démarre très bien.

+0

Quand je appelez la méthode Fill, en commentant le code multithreading, et en mettant simplement Fill() à la place, cela fonctionne. C'est pourquoi je suis confus quant à savoir pourquoi il ne fonctionne pas avec MT ... – Rudy

3

Je pense que vous rencontrez des problèmes car vous n'êtes pas sur le thread d'interface utilisateur lorsque vous essayez d'écrire dans la zone de texte dans la méthode Fill() - cela provoquera une exception. Pour résoudre le problème, vous devez passer au thread d'interface utilisateur en utilisant BeginInvoke et un délégué comme dans l'exemple ci-dessous:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim t1 As System.Threading.Thread = New System.Threading.Thread(AddressOf Me.Fill) 
     t1.Start() 

End Sub 

Private Delegate Sub FillDelegate() 

Private Sub Fill() 
     If TextBox1.InvokeRequired Then 
      TextBox1.BeginInvoke(New FillDelegate(AddressOf Fill)) 
     Else 
      TextBox1.Text = "Worked!!!!" 
     End If 
End Sub 
+0

+1 rip est correct, l'interface utilisateur est sur un autre thread. – Walter

+0

Mais l'OP se plaint que la fonction de remplissage ne démarre jamais, pas qu'elle ne fasse pas ce qui est requis. – AngryHacker

+0

Ne pas se plaindre d'une exception non plus. Utilise probablement Form1.TextBox1.Text. Cela ne fonctionne pas, Form1 crée un nouveau formulaire. Un invisible. –

-1

Assurez-vous que votre gestionnaire de bouton a encore Handles Button1.Click à la fin de celui-ci. Parfois, les gens coupent et collent le bouton à un autre endroit sur leur formulaire, ce qui provoque le désancrage de l'EDI et laisse le gestionnaire "orphelin".