2010-01-02 23 views
0

Guys Sup,Thread Safe méthode Invoke ne marche pas travailler

J'ai une fonction sur mon Wich frmMain classe mettra à jour mon contrôle à quelque chose d'autre après un Invoke. Lorsque je tape "? Label1.Text" dans la fenêtre Exécution, la propriété text est mise à jour, mais quand je vais vérifier le formulaire, rien ne se passe. Le code est comme ce

Public Sub UpdateUI() 
    If (Me.InvokeRequired = True) Then 
     Invoke(New MethodInvoker(AddressOf UpdateUI)) 
    End If 
    Label1.Text = "ITS NOT WORKING =\" 
End Sub 

Sur mon bgWorker Classe:

Private threadUpd As New Threading.Thread(AddressOf Updater) 
Private _active as Boolean 
Public Sub New() 
    _active = True 
    threadLimpar.IsBackground = True 
    threadLimpar.Start() 
End Sub 

Public Sub Updater() 
    Do 
     If (_active = False) Then 
      Try 
       Thread.Sleep(Timeout.Infinite) 
      Catch ex As ThreadInterruptedException 
      End Try 
     Else 
      if(condition...) then 
       frmMain.UpdateUI 
     End if 
    Loop 
End Sub 

Répondre

3

Il est un piège classique VB.NET, tout le monde tombe dans au moins une fois quand ils commencent à l'aide de fils:

frmMain.UpdateUI 

Maintenant, nous ne pouvons pas voir ce que signifie exactement "frmMain". Mais le fait que vous ayez posté cette question suggère que frmMain est le nom de votre classe de formulaire principale. Ce n'est pas le nom d'un champ de votre classe qui stocke une référence au formulaire principal.

Cela ne fonctionne pas. La variable que le compilateur VB.NET génère pour vous permettre de référencer en tant que classe comme s'il s'agit d'une variable a <ThreadStatic> sémantique. En d'autres termes, chaque thread créera sa propre instance d'un formulaire. Vous pouvez sorta voir quand vous écrivez comme ceci:

frmMain.UpdateUI 
frmMain.Show 

Mais vous verrez un « fantôme » de la fenêtre, il en est autrement raide mort depuis le fil il a été créé ne pompe pas un boucle de message.

Vous aurez besoin d'une référence réelle au formulaire. Cela pourrait être "Moi" si Updater est une méthode de la classe de formulaire. Si ce n'est pas le cas, Application.OpenForms pourrait le fournir. La meilleure chose à faire est de donner à la classe qui contient Updater une référence au formulaire via son constructeur.

+0

J'étais presque sûr que c'était quelque chose comme ça, mais pouvez-vous me donner un exemple de comment je fais référence à ma forme déjà ouverte? – Alex

2

Vous devriez probablement mettre fin à la fonction si InvokeRequired retourne vrai, mais vous définissez le texte de l'étiquette de toute façon. Voici ce que vous pourriez faire:

Public Sub UpdateUI() 
    If (Me.InvokeRequired = True) Then 
     Invoke(New MethodInvoker(AddressOf UpdateUI)) 
    Else 
     Label1.Text = "ITS NOT WORKING =\" 
    End If 
End Sub 
+0

Je voudrais pouvoir taper plus vite, lol: D – Paolo

+0

Je suis tenté de faire une rétrogradation juste parce que vous effectuez des comparaisons d'égalité entre un booléen et une constante, mais la question de l'OP l'a fait, donc je vais de toute façon. Utilisez des opérateurs booléens. –

+0

Eh bien, je pense que je suis un abruti car cela ne fonctionne PAS, même si, comme je l'ai dit, je peux voir qu'il a été mis à jour si je vérifie la fenêtre immédiate, mais le formulaire lui-même n'a pas de mise à jour. Encore aucun conseil – Alex

1

Je pense que vous voulez ce qui suit:

Public Sub UpdateUI() 
    If (Me.InvokeRequired) Then 
     BeginInvoke(New MethodInvoker(AddressOf UpdateUI)) 
    Else 
     Label1.Text = "ITS NOT WORKING =\" 
    End If 
End Sub 
+0

Encore ne fonctionne pas, le label n'a pas été mis à jour sur le formulaire, même si je peux le voir "mis à jour" par la fenêtre immédiate – Alex

+0

En allant sur le code dans votre question, cette solution devrait mettre à jour le texte de l'étiquette. –

+0

Eh bien, je pense que je suis un abruti parce que cela ne fonctionne pas, même si, comme je l'ai dit, je peux voir qu'il a été mis à jour si je vérifie la fenêtre immédiate, mais le formulaire lui-même n'a pas de mise à jour. D'autres indices? – Alex