IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Thread : Operation inter-threads non valide


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut Thread : Operation inter-threads non valide
    Après avoir buté sur les évenements , je pensais que ce serait simple et que j'aurais juste à mettre mon sub en thread, mais non...

    dans button1_click, j'ai remplacer mon appel direct "RempliListView(mesSources)" par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim th As New Threading.Thread(AddressOf RempliListView)
    th.Start(mesSources)
    mais j'obtiens :

    Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans System.Windows.Forms.dll

    Informations supplémentaires : Opération inter-threads non valide : le contrôle 'ListView1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

    Pourtant mon appel au thread est bien fait dans la classe du formulaire...

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Un Thread différent du thread principal de l'application ne peut pas modifier des Controls présents dans les Form.

    Par exemple, je ne vois aucune solution pour avoir une visualisation d'avancement de 1 à n d'un process qui va initialiser les controls de n forms.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Un Thread différent du thread principal de l'application ne peut pas modifier des Controls présents dans les Form.

    Par exemple, je ne vois aucune solution pour avoir une visualisation d'avancement de 1 à n d'un process qui va initialiser les controls de n forms.
    >qui va initialiser les controls de n forms
    non ça n'initialise pas, ça doit mettre à jour "l'état".

    Un peu comme un gestionnaire de téléchargement ou autre...

    qui met à jour chaque "ligne" avec sa vitesse de téléchargement par exemple.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Un Thread différent du thread principal de l'application ne peut pas modifier des Controls présents dans les Form.

    Par exemple, je ne vois aucune solution pour avoir une visualisation d'avancement de 1 à n d'un process qui va initialiser les controls de n forms.
    autant pour moi, j'ai appelé l'initialisation de mon listview...

    du coup j'ai modifié, mais mon problème est déporté ailleurs (dans le retour d'événement "S2")

    correction dans Button1_Click :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     RempliListView(mesSources)
     
            Dim th As New Threading.Thread(AddressOf MajLesSources)
            th.Start()
    ...etc...
     
     
    Private Sub MajLesSources()
            mesSources.majSource()
        End Sub
    S2 qui est à l'écoute, me m'indique du coup que la modification sur le listview et faite par autre chose que le form :

    Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans System.Windows.Forms.dll

    Informations supplémentaires : Opération inter-threads non valide : le contrôle 'ListView1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub S2(ByVal sender As Object, ByVal e As MajSourceEventArgs)
            Dim lasource As Source = sender
            ListView1.Items(lasource.Nom).SubItems(1).Text = lasource.Champ2
            ' MessageBox.Show(Me, "Detection Maj source", "Maj Source")
        End Sub

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut
    Bonjour,

    Je viens de passer une partie de la nuit et de trouver quelque chose qui fonctionne ! enfin presque...

    Pour ce faire j'ai limiter mon exemple, mais je me retrouve avec quelque chose d'étrange :
    - 2 Threads, l'un avec une pause de 2000ms et l'autre de 500ms, je devrais donc avoir dans mon affichage l'un qui s'affiche plus vite que l'autre, ce qui n'est pas le cas
    - le freeze du formulaire, quand j'ai lancé le traitement, je ne peux pas bouger, bref rien faire sur le formulaire tant que les 2 threads n'ont pas finis.

    Voici le code (beaucoup pour pas grand chose au final), le formulaire contien 1 Richtextbox et un bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     Public Structure ParamTh
            Dim texte As String
            Dim pause As Integer
        End Structure
     
    Private Delegate Sub UIDelegate(ByVal val As Integer, ByVal texte As String)
     
      Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
     
            Dim thread = New System.Threading.Thread(AddressOf del)
            'thread.IsBackground = True
            Dim thread2 = New System.Threading.Thread(AddressOf del)
            'thread2.IsBackground = True
            Dim th1 As ParamTh
            th1.texte = "Thread1"
            th1.pause = 2000
            thread.Start(th1)
     
            Dim th2 As ParamTh
            th2.texte = "Thread2"
            th2.pause = 500
            thread2.Start(th2)
     
        End Sub
     
        Private Sub AddTextToUI(i As Integer, texte As String)
            RichTextBox1.AppendText(texte & Environment.NewLine)
            Thread.Sleep(i)
            RichTextBox1.Update()
        End Sub
     
        Private Sub del(ByVal param As ParamTh)
            For i As Integer = 0 To 10
                Me.Invoke(New UIDelegate(AddressOf AddTextToUI), param.pause, param.texte)
            Next
        End Sub
    Merci d'avance pour vos lumières !

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    non me.invoke fait que ce qui suit est appelé sur le thread principal (c'est comme si ca changeait de thread)
    donc c'est ton thread principal qui fait le .sleep
    si tu veux 2 délais différents, c'est au thread de faire le .sleep (de plus un sleep sur le thread principal freeze l'interface)
    et je ne vois pas ce que ta boucle for fait ici

    un thread ne peut faire qu'une chose à la fois, vu que tu as 2 threads qui essaye de repasser sur le thread principal, c'est chacun leur tour
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    non me.invoke fait que ce qui suit est appelé sur le thread principal (c'est comme si ca changeait de thread)
    donc c'est ton thread principal qui fait le .sleep
    si tu veux 2 délais différents, c'est au thread de faire le .sleep (de plus un sleep sur le thread principal freeze l'interface)
    et je ne vois pas ce que ta boucle for fait ici

    un thread ne peut faire qu'une chose à la fois, vu que tu as 2 threads qui essaye de repasser sur le thread principal, c'est chacun leur tour
    >c'est ton thread principal qui fait le .sleep
    Ok, j'ai mis ceci pour "ralrentir" et simulé un long traitement, je ne vois pas comment dire au thread "en cours" de faire une pause alors, si ce n'est les déclarer en "global"

    >je ne vois pas ce que ta boucle for fait ici
    La boucle est là pour simulé plusieurs appels (comme pour mon projet "principal", l'extraction des informations des fichiers un à un mais à distribué à différent thread du coup...), mais en effet, je devrais peut-être tenter de faire une sorte de "tache" à traiter par des threads.

    Donc un tableau de x threads, sans que les thread ne prenne la même tâche à traiter.

Discussions similaires

  1. Réponses: 7
    Dernier message: 09/05/2014, 19h14
  2. Operation inter thread
    Par anatw73 dans le forum VB.NET
    Réponses: 2
    Dernier message: 03/02/2011, 02h33
  3. Accès inter-threads non valide et BitmapImage
    Par Louis745 dans le forum Silverlight
    Réponses: 6
    Dernier message: 31/10/2010, 16h16
  4. Opération inter-threads non valide
    Par nakk01 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 26/05/2009, 01h43
  5. Erreur : Opération inter-threads non valide
    Par cadeau dans le forum C++/CLI
    Réponses: 1
    Dernier message: 12/12/2006, 09h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo