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 :

Utilisation d'une list of() dans un autre thread


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 27
    Points : 18
    Points
    18
    Par défaut Utilisation d'une list of() dans un autre thread
    Pour exemple, prenons un objet simple et une classe qui permet d'en faire des listes. Dans cette classe j'ajoute un sub simple qui permet d'ajouter un objet à la liste à partir d'un string (j'ai simplifié la manip que je fais avec un simple tolower).
    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
    Class MyCustomObject
        Public Prop1 As String
        Public Prop2 As String
    End Class
     
    Class MyCustomObjectList
        Inherits List(Of MyCustomObject)
     
        Public Sub AddFromString(ByVal StringToAdd As String)
            Dim Temp_Obj As New MyCustomObject
            Temp_Obj.Prop1 = StringToAdd
            Temp_Obj.Prop2 = StringToAdd.ToLower
            Me.Add(Temp_Obj)
        End Sub
     
    End Class
    Je déclare une nouvelle variable au début de mon application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MyCustomList As New MyCustomObjectList
    Aucun problème lorsque je fais des add(object) ou des AddFromString(string) depuis le thread principal, mais si je lance un thread secondaire AddFromString(string) ne fonctionne pas, j'ai l'erreur :
    La référence d'objet n'est pas définie à une instance d'un objet.
    J'ai bien compris que le debugger me reproche de ne pas avoir instancié ma variable dans le thread ou je l'utilise. Pourtant les autres méthode (add, contains etc...) fonctionnent, et des variables comme string() déclarées dans le thread principal fonctionnent parfaitement dans le thread secondaire...

    La question est donc, comment fait-on?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il faudrait qu'on voit plus de code pour te dire ton erreur

    le Dim MyCustomList As New MyCustomObjectList est sur quelle classe ?
    le code du thread est où ?

    J'ai bien compris que le debugger me reproche de ne pas avoir instancié ma variable dans le thread ou je l'utilise.
    non il ne te reproche de ne pas l'avoir instancié dans le thread, mais d'essayer de manipuler quelque chose de non instancié

    une variable n'est pas liée à un thread, elle est toujours accessible de tous les threads
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    il faudrait qu'on voit plus de code pour te dire ton erreur

    le Dim MyCustomList As New MyCustomObjectList est sur quelle classe ?
    le code du thread est où ?


    non il ne te reproche de ne pas l'avoir instancié dans le thread, mais d'essayer de manipuler quelque chose de non instancié

    une variable n'est pas liée à un thread, elle est toujours accessible de tous les threads
    Pourtant la même MyCustomList manipulée dans le thread principal : pas de problème...
    Quel partie du code veux-tu voir en plus?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    le Dim MyCustomList As New MyCustomObjectList est sur quelle classe ?
    le code du thread est où ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Ok, je me suis mal exprimé dans mon premier post .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MyCustomList As New MyCustomObjectList
    Est dans ma classe Main (correspondant à mon UI principale).

    Code du thread en plus dans cette même classe Main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     Dim MyThread As New Threading.Thread(AddressOf MyFunctionThread)
     
    'Plus loin j'ai un sub qui fait :
    Sub LaunchThread()
    MyThread = New Threading.Thread(AddressOf MyFunctionThread)
    MyThread.Start()
    MyThrea.IsBackground = True
    End Sub
     
    'Et le code de MyFunctionThread
     Sub MyFunctionThread()
    MyCustomList.AddFromString("Test TTTT")
     End Sub
    Précision, avant d'utiliser mon MyCustomObject, j'utilisais une simple string pour concaténer toutes mes valeurs au lieu de les mettre dans une liste, c'est sale et moins efficace, mais ça marchait très bien...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    aucune erreur chez moi avec le code suivant
    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
    37
    38
    39
    40
    41
    42
    43
     
    Public Class Form1
     
        Sub New()
            InitializeComponent()
     
            LaunchThread()
     
        End Sub
     
        Dim MyCustomList As New MyCustomObjectList
     
        Dim MyThread As Threading.Thread ' ca ne sert à rien de faire un new sachant que tu en fais un plus bas
     
        Sub LaunchThread()
            MyThread = New Threading.Thread(AddressOf MyFunctionThread)
            MyThread.IsBackground = True
            MyThread.Start()
        End Sub
     
        Sub MyFunctionThread()
            MyCustomList.AddFromString("Test TTTT")
        End Sub
     
    End Class
     
     
    Class MyCustomObject
        Public Prop1 As String
        Public Prop2 As String
    End Class
     
    Class MyCustomObjectList
        Inherits List(Of MyCustomObject)
     
        Public Sub AddFromString(ByVal StringToAdd As String)
            Dim Temp_Obj As New MyCustomObject
            Temp_Obj.Prop1 = StringToAdd
            Temp_Obj.Prop2 = StringToAdd.ToLower
            Me.Add(Temp_Obj)
        End Sub
     
    End Class
    donc c'est bien une erreur quelque part dans ton code
    ou alors tu penses que le message d'erreur venait de là alors qu'il vient d'ailleurs ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Effectivement, merci Pol63, je me suis trop concentré sur la partie ou l'erreur est levée alors qu'en fait un vieux bout de code ailleurs dans mon programme faisait un truc à la con :


    donc résolu !
    Merci encore pour vos réponses si rapides !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Utiliser valeur d'une liste de choix dans une liste déroulante d'un autre formulaire
    Par Sébastien1609 dans le forum Macros Access
    Réponses: 1
    Dernier message: 11/06/2015, 15h31
  2. Réponses: 1
    Dernier message: 06/03/2013, 18h27
  3. Réponses: 6
    Dernier message: 16/09/2009, 23h43
  4. [C#] Comment appeler une fenêtre modale dans un autre thread ?
    Par Pilloutou dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/10/2006, 11h19
  5. Utilisation d'une Variable(Vb) dans d'autre language
    Par cach dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/02/2005, 12h00

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