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 :

[VB.NET] Threading : pourquoi mes données ne sont pas sauvées ?


Sujet :

VB.NET

  1. #1
    Membre actif Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 296
    Points
    296
    Par défaut [VB.NET] Threading : pourquoi mes données ne sont pas sauvées ?
    Bonjour,
    J'ai un problème de thread qui après son execution les variables qu'il a modifié reviennent à leur valeur d'origine!

    mon code de test

    dans un module:
    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
     
    Imports System.Threading
    Module Test
        Private Structure mytab
            Public filename As String
            Public width As Integer
            Public height As Integer
            Public bmp As Bitmap
            Public Sub load()
                bmp = New Bitmap(filename)
                width = bmp.Width
                height = bmp.Height
                filename = "pouet a pouet"
                MsgBox("dans le thread: H:" & height & ", W:" & width & ", File:" & filename)
            End Sub
        End Structure
     
        Public Structure Prout
            Private tab() As mytab
            Private Inc As Integer
     
            Public Sub Add(ByVal filename As String)
                If tab Is Nothing Then
                    ReDim tab(0)
                Else
                    ReDim Preserve tab(Inc)
                End If
                tab(Inc).filename = filename
                Dim mythread As Thread = New Thread(AddressOf tab(Inc).load)
                mythread.Start()
                Do While mythread.ThreadState <> ThreadState.Stopped
                Loop
                MsgBox("Hors du thread: H:" & tab(Inc).height & " W:" & tab(Inc).width & " File:" & tab(Inc).filename)
                Inc += 1
            End Sub
     
        End Structure
     
        Public Pouet As Prout
    End Module
    dans le formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Class Form1
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Pouet.Add("E:\ressources\back.jpg")
        End Sub
    End Class
    Les 2 msgbox affiches des données differente

  2. #2
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Normal, c'est une structure.
    C'est un ValueType.
    Donc son passage en paramètre est par recopie, et pas par référence.

    La structure que tu utilise dans ton thread est une copie de celle que tu as créé en dehors
    Utilise une classe.

  3. #3
    Membre actif Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 296
    Points
    296
    Par défaut
    malheureusement je veux garder mes données dans une structure.

  4. #4
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    C'est malheureux effectivement.
    Je ne peux pas t'aider, je ne parle pas VB. En C# il y a un moyen de forcer le passage par référence. C'est pas très conseillé, mais c'est possible, avec le mot clef 'ref'.

  5. #5
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    En VB.Net, pour forcer le passage par référence, il faut utiliser le mot clé ByRef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Class RefExample
        Shared Sub Method(ByRef i As Integer)
            i = 44
        End Sub
     
        Shared Sub Main()
            Dim val As Integer = 0
            ' ici val vaut 0
            Method(val)
            ' ici val vaut 44 (il vaudrait 0 sans le passage par référence)
        End Sub
    End Class
    Pas de questions techniques par MP

  6. #6
    Membre actif Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 296
    Points
    296
    Par défaut
    on ne peut pas utiliser d'argument dans un thread, le byref ne sert donc ici a rien.

  7. #7
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Citation Envoyé par ShadowTzu
    on ne peut pas utiliser d'argument dans un thread, le byref ne sert donc ici a rien.
    Si si on peut !!, il faut utiliser le delegate ParameterizedStartThread , mais il n'es pas possible de faire passer des objets par references.

    Le probleme dans ton cas n'est pas dû à un passage de parametre par reference ou par copie mais plutot dans la maniere avec laquelle tu creer le Thread. En utilisant une methode dans une structure comme delegate de ton thread, le thread dans son contexte va creer une copie de ses variables et donc ne pas pourra pas mettre à jours ces variables comme tu l'as voulu, d'ailleurs il faut que je revoit pourquoi c'est un truc que je connais c'est tout.

    Voila ce que je te propose pour te montrer comment il faut faire, ensuite c'est à toi de restructerer tes structures et classes :

    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
     
        Public Structure mytab
            Public filename As String
            Public width As Integer
            Public height As Integer
            Public bmp As Bitmap
        End Structure
     
        Public Sub load(ByVal o As Object)
            Dim filename As String = CType(o, String)
            Pouet.tab(Pouet.Inc).filename = filename
            Pouet.tab(Pouet.Inc).bmp = New Bitmap(filename)
            Pouet.tab(Pouet.Inc).width = Pouet.tab(Pouet.Inc).bmp.Width
            Pouet.tab(Pouet.Inc).height = Pouet.tab(Pouet.Inc).bmp.Height
            Pouet.tab(Pouet.Inc).filename = "pouet a pouet"
            Console.WriteLine("dans le thread: H:" & Pouet.tab(Pouet.Inc).height & ", W:" & Pouet.tab(Pouet.Inc).width & ", File:" & Pouet.tab(Pouet.Inc).filename)
        End Sub
     
        Public Structure Prout
            Public tab() As mytab
            Public Inc As Integer
     
            Public Sub Add(ByVal filename As String)
                If tab Is Nothing Then
                    ReDim tab(0)
                Else
                    ReDim Preserve tab(Inc)
                End If
                Dim operation As New ParameterizedThreadStart(AddressOf load)
     
                Dim mythread As Thread = New Thread(operation)
     
                mythread.Start(filename)
     
                Do While mythread.ThreadState <> ThreadState.Stopped
                Loop
                Console.WriteLine("Hors du thread: H:" & tab(Inc).height & " W:" & tab(Inc).width & " File:" & tab(Inc).filename)
                Inc += 1
            End Sub
     
        End Structure
    Il te reste à gerer les concurrences d'accees sur l'objet Pouet.
    Mehdi Feki : Modérateur .Net

  8. #8
    Membre actif Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 296
    Points
    296
    Par défaut
    Merci! L'utilisation de ParameterizedThreadStart m'a permis de régler mon problème

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

Discussions similaires

  1. Pourquoi mes widgets ne sont pas indépendants ?
    Par shaiHulud dans le forum Tkinter
    Réponses: 1
    Dernier message: 14/03/2011, 18h16
  2. Réponses: 3
    Dernier message: 12/03/2009, 15h11
  3. [C#Express 2008] Pourquoi mes CustomControls ne sont pas utilisables en mode Design ?
    Par neguib dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 27/11/2008, 10h43
  4. Réponses: 26
    Dernier message: 05/02/2007, 16h57
  5. [WebForms][2.0] Pourquoi mes liens ne sont-ils pas valides ?
    Par ben_popcorn dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 19/09/2006, 16h11

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