Partage
  • Partager sur Facebook
  • Partager sur Twitter

button click depuis un autre thread

Sujet résolu
    17 août 2021 à 10:29:37

    Bonjour,

    Depuis mon form initiale (Form1), j'importe un autre form (Form2) que j’intègre dès l'ouverture du Form1 dans un panel (Pnl_General).

    Lorsque je clic sur le controle BtnValidCredential qui est un bouton et qui à été créé depuis le Form2, j'ai le message d'erreur suivant qui s'affiche :

    "Opération inter-threads non valide : le controle 'BtnValidCredential' a fait l'objet d'un accès à partir d'un autre thread autre que celui sur lequel il a été créé."

    à l'intérieur de ce bouton, je fais appel à la class Win32 ou son regroupé quelques fonctions de l'Api Win32.

    Pouvez-vous m'aider à résoudre ce problème s'il vous plait.

    Apparemment il faut utilisé un délégué mais je ne vois vraiment pas comment l'utiliser.

    Code Form1 :

    Public Class Form1   
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Switch_Panel(Form2)
        End Sub
    
        Sub Switch_Panel(ByRef panel As Form)
            Pnl_General.Controls.Clear()
            panel.TopLevel = False
            Pnl_General.Controls.Add(panel)
            panel.Show()
    
        End Sub
    
    End Class

    Code Form2 :

    Public Class Form2  
    
        Private Sub BtnValidCredential_Click(sender As Object, e As EventArgs) Handles BtnValidCredential.Click
                  If TxtBoxLogin.Text <> "" Or TxtBoxMDP.Text <> "" Then
                If TxtBoxLogin.Text <> "Nom d'utilisateur" And TxtBoxMDP.Text <> "Mot de passe" Then
    
                    Dim THREAD_LoginIsCorrect As New Thread(Sub() LoginIsCorrect())
                    THREAD_LoginIsCorrect.IsBackground = True
                    THREAD_LoginIsCorrect.Start()
                Else
                    MessageBox.Show("Le Nom d'utilisateur ou le mot de passe est incorrect !")
                End If
            Else
                MessageBox.Show("Merci de remplir tous les champs !")
            End If
        End Sub
    
        Public Sub LoginIsCorrect()
            Try
                Dim token As New IntPtr
                Dim Username As String = TxtBoxLogin.Text.Trim
                Dim DomainUser As String = Domain.GetCurrentDomain.ToString 'domain.GetCurrentDomain.ToString 
                Dim Password As String = TxtBoxMDP.Text.Trim
    
                Dim retVal = Win32.LogonUser(Username, DomainUser, Password, Win32.LogonType.LOGON32_LOGON_NETWORK, Win32.LogonProvider.LOGON32_PROVIDER_DEFAULT, token)
    
                If My.Computer.Network.IsAvailable Then 
                    BtnValidCredential.Enabled = False
                    Me.Cursor = Cursors.WaitCursor
    
                    If retVal <> 0 Then
    
                        Me.Cursor = Cursors.Default
                        BtnValidCredential.Enabled = True
                        TimestampControllerDomain(Username, Password)
                        Login = TxtBoxMDP.Text.Trim
                        MDP = TxtBoxMDP.Text.Trim
                    Else
                        BtnValidCredential.Enabled = True
                        Me.Cursor = Cursors.Default
                        MessageBox.Show("Erreur ID ou Mdp")
                    End If
                Else
                    MsgBox("Vous n'êtes pas connecté au réseau !")
                End If
            Catch ex As Exception
                MsgBox("sd" & " Can 't create the process. " & ex.Message)
            End Try
        End Sub
    
    End Class




    Merci d'avance pour votre aide..

    -
    Edité par Mojow 17 août 2021 à 10:32:15

    • Partager sur Facebook
    • Partager sur Twitter
      18 août 2021 à 21:00:31

      Cela n'a pas de lien avec votre problème initial mais je vous conseille chaudement de ne pas include/hoster un formulaire dans un autre formulaire.

      Un formulaire est conçu pour héberger des contrôles (des User Controles si nécessaire) et pas d'autres formulaires.

      Votre problème vient du fait que les contrôles Win32 utilisés par Winform ne sont pas thread-safe mais que le Framework Winform à l'amabilité de vous éviter de vous tirez une balle dans le pied.

      La "solution" la plus simple (sans avoir à refondre votre application), c'est d'utiliser la méthode Invoke de la classe Form pour accéder à un contrôle (lecture /écriture de propriété ou appel de méthode).

      https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.control.invoke?view=net-5.0

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        23 août 2021 à 16:41:06

        Merci après plusieurs test cela fonction avec les Invoke.
        • Partager sur Facebook
        • Partager sur Twitter
          24 août 2021 à 5:44:07

          Mojow a écrit:

          Merci après plusieurs test cela fonction avec les Invoke.

          Bonjour,

          Sujet résolu

          Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

          • Partager sur Facebook
          • Partager sur Twitter

          button click depuis un autre thread

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown