none
problème d’accéder au contrôle Form avec thread RRS feed

  • Question

  • je peut pas accédé au contrôle Form avec thread exp je peut pas modifier la color Label avec thread il affiche un erreur ce contrôle est utiliser avec autre thread:

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    dim TH 
    Th = New Threading.Thread(AddressOf FunctionThread)
        Th.Start()
    
    end sub
    
     Public Sub FunctionThread()
        Label.Text = "Recherche suspendu"
        Label.BackColor = Color.Red
      End Sub

    il affiche un erreur problème de thread safe

     

    Cordialement !

    jeudi 30 décembre 2010 10:03

Réponses

  • Bonjour,

    Il faut mettre en place un accès Thread-Safe à ton Form en utilisant la méthode Invoke .

    Voilà un article MSDN qui en parle : http://msdn.microsoft.com/fr-fr/library/ms171728.aspx

    Voilà ce que ça donne pour ton code :

     

     Private Delegate Sub SetTextCallback(ByVal [text] As String)
    
     Public Sub SetMyLabelText(ByVal newText As String)
     ' InvokeRequired required compares the thread ID of the
     ' calling thread to the thread ID of the creating thread.
     ' If these threads are different, it returns true.
     If Me.myLabel.InvokeRequired Then
     ' It's on a different thread, so use Invoke.
     Dim d As New SetTextCallback(AddressOf SetMyLabelText)
     Me.Invoke(d, New Object() {newText})
     Else
     ' It's on the same thread, no need for Invoke.
     Me.myLabel.Text = newText
     Me.myLabel.BackColor = Color.Red
     End If
     End Sub
     
     Public Sub FunctionThread()
     SetMyLabelText("Recherche suspendue")
     End Sub
    

     

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    jeudi 30 décembre 2010 10:08

Toutes les réponses

  • Bonjour,

    Il faut mettre en place un accès Thread-Safe à ton Form en utilisant la méthode Invoke .

    Voilà un article MSDN qui en parle : http://msdn.microsoft.com/fr-fr/library/ms171728.aspx

    Voilà ce que ça donne pour ton code :

     

     Private Delegate Sub SetTextCallback(ByVal [text] As String)
    
     Public Sub SetMyLabelText(ByVal newText As String)
     ' InvokeRequired required compares the thread ID of the
     ' calling thread to the thread ID of the creating thread.
     ' If these threads are different, it returns true.
     If Me.myLabel.InvokeRequired Then
     ' It's on a different thread, so use Invoke.
     Dim d As New SetTextCallback(AddressOf SetMyLabelText)
     Me.Invoke(d, New Object() {newText})
     Else
     ' It's on the same thread, no need for Invoke.
     Me.myLabel.Text = newText
     Me.myLabel.BackColor = Color.Red
     End If
     End Sub
     
     Public Sub FunctionThread()
     SetMyLabelText("Recherche suspendue")
     End Sub
    

     

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    jeudi 30 décembre 2010 10:08
  • Bonjour,

    Il faut appeler votre code dans le Thread de l'affichage. Pour cela il faut utiliser la méthode Invoke de la classe Control :

        Me.Label1.Invoke(Sub()
                   Me.Label1.Text = "Recherche suspendu"
                   Me.Label1.BackColor = Color.Red
                 End Sub)
    

    Pour réaliser des traitements d'arrière plan, n'hésitez pas à utiliser le composant BackgroundWorker.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    jeudi 30 décembre 2010 10:16
    Modérateur
  • comment faire l’appel de cette fonction  dans thread !!

     Me.Label1.Invoke(Sub()
            Me.Label1.Text = "Recherche suspendu"
            Me.Label1.BackColor = Color.Red
           End Sub)

    jeudi 30 décembre 2010 10:56
  • Bonjour,

    Si tu souhaites utiliser la proposition de Gilles, tu fais :

    Public Sub SetMyLabelText()
      Me.Label1.Invoke(Sub()
        Me.Label1.Text = "Recherche suspendu"
        Me.Label1.BackColor = Color.Red
        End Sub)
    End Sub

     
    Et dans FunctionThread, tu mets :

    Public Sub FunctionThread()
      SetMyLabelText()
    End Sub

    Et cela devrait fonctionner :)

    Cordialement,

    Thomas

     


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    jeudi 30 décembre 2010 16:36
  • il affiche une erreur "expression attendu " au niveaux de mots (Sub() !!! mon code c :

     

    Public Sub SetMyLabelText()
     Me.Label1.Invoke(Sub()
     Me.Label1.Text = "Recherche suspendu"
     Me.Label1.BackColor = Color.Red
     End Sub)
    End Sub
    
     
    Et dans FunctionThread, tu mets :
    
    Public Sub FunctionThread()
     SetMyLabelText()
    End Sub
    
     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    
      titre.Visible = True
      Th = New Threading.Thread(AddressOf FunctionThread)
      Th.Start()
    End Sub

    lundi 3 janvier 2011 08:24
  • Bonjour,

    Quelle version de Visual Studio utilisez vous ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    lundi 3 janvier 2011 08:50
    Modérateur
  • VS 2008

    Cordialement .

    lundi 3 janvier 2011 08:57
  • J'ai pas la possibilité de tester la version de Gilles et comme ce n'est pas celle que j'utilise, je ne sais pas ce qui va pas.

    Essaye avec la version que je t'avais proposé.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    lundi 3 janvier 2011 09:16
  • merci 

    Thomas Aimonetti :   ça marche très bien

    et même  pour

    Gilles .

     

    Cordialement .

    lundi 3 janvier 2011 10:08