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

C# Discussion :

multithreading et probleme de création d'objet


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 20
    Points
    20
    Par défaut multithreading et probleme de création d'objet
    bonjour,

    j'ai un programme qui fait du multithreading, le souci est que je crée dans un même thread deux objet a la suite l'un de l'autre, lorsque la création du deuxième objet se termine ça me ré-écrit le premier.
    comment faire pour dissocier les deux création afin de ne plus avoir se problème de ré-écriture?
    les deux objet sont crée a partir de la même class.

  2. #2
    Membre habitué
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Points : 144
    Points
    144
    Par défaut
    Bonjour.

    S'il s'agit d'une variable statique, tu peux la décorer avec [TreadStatic]
    ainsi chaque thread aura sa version de la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Toto
    {
        [ThreadStatic]
        private static int Valeur;
    }
    sinon, si elle n'est pas statique et qu'elle n'a aucune raison de l'etre, je te suggère de plutot voir pour la passer en paramètre là où il y en a besoin.

    Bonne journée.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    pour etre plus claire mon code s'éxecute dans sont thread principale, puis je crée deux objet d'un même classe.
    lors de la création d'un de ses objet des thread sont lancer pour recuperer des valeur et lui assigner a ces champs.
    lorsque je crée le deuxieme objet, celui ci fait de nouveau appelle a des thread pour recuperer ses valeur (qui sont differente du premier objet)
    mais des que la création de se deuxieme objet est fini je m'appercois que le premier se retrouve avec les valuer du deuxiéme.
    la c'et pas bon.

    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
     
    public static AutoResetEvent autowait;
    //thread principal
    autowait = new AutoResetEvent(false);
    MonObjet obj1 = new MonObjet;
    autowait.WaitOne();
    MonObjet obj2 = new MonObjet;
    //thread principal
     
    //dans la classe MonObjet
     
    public MonObjet()
    {
           Thread th1 = new Thread(Find value);
           th1.Stat();
           autowait.Set();
    }
    lors de la création du deuxiéme objet je sais pas se qui se passe mais sa me ré écrit le premier, avec les valeur du deuxieme du coup les deux objet sont identique alors qu'ils devraient etre different.
    si tu sais comment faire pour pouvoir les dissocier sa m'aiderais beaucoup.

  4. #4
    Membre habitué
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Points : 144
    Points
    144
    Par défaut
    Ca ne résoud pas le problème technique, mais si je comprends bien, tes classe "MonObjet" ne sont pas utilisables tant que le thread n'est pas allé alimenter leur valeur interne.

    Si c'est bien le cas, pourquoi vouloir les mutithreader ? de toutes facons, ton thread principal va attendre leur initialisation pour les consommer

    sinon, j'avoue que j'aimerai bien plus de détails pour le code de "MonObjet" pour voir où ca peut coincer.

    Bon week end

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    les objet en question sont des sonde qui on plusieurs champs(valeur + seuil, nom, etc) et sont interroger en SNMP, afin de gagner du temps et éviter a mon interface de freeze pendant le traitement. j'interroge toutes ces valeur en parallèle donc chaque valeur= un thread.
    mon souci est que lorsque je crée un deuxième objet cela ré-écrit le premier donc si quelqu'un sais comment faire pour que les thread de modifie pas les autre objet se serais sympas car je galère beaucoup ......

    merci d'avance.

  6. #6
    Membre habitué
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Points : 144
    Points
    144
    Par défaut
    je t'envoie un petit exemple, après à toi d'adapter.
    Merci de me tenir au jus pour voir si ca répond au besoin.

    Bonne journée.

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    using System;
    using System.Collections.Generic;
    using System.Threading;
     
    namespace TstThreadAsync
    {
        class Program
        {
            private static int index;
            private static object lockIndex = new object();
            public static List<MonObjet> MesObjets { get; set; }
     
            static void Main(string[] args)
            {
                for (int i = 0; i < 20; i++)
                {
                    var monObjet = new MonObjet();
                    ThreadPool.QueueUserWorkItem(state => AlimenterValeurs(monObjet));
                }
     
                Console.WriteLine("Appuyez sur une touche pour quitter");
                Console.ReadLine();
            }
     
            static void FinAlimenterValeurs(MonObjet objet)
            {
                // Raffraichissment IHM.
                Console.WriteLine(string.Format("objet alimenté : Valeur1: {0}, Valeur2: {1} Valeur3: {2}, Valeur4: {3}, Valeur5: {4}", objet.Valeur1, objet.Valeur2, objet.Valeur3, objet.Valeur4, objet.Valeur5));
                MesObjets.Add(objet);
            }
     
            public static void AlimenterValeurs(MonObjet objet)
            {
                var random = new Random();
                Thread.Sleep(random.Next(0, 2000));
                objet.Valeur1 = GetNext();
                objet.Valeur2 = GetNext();
                objet.Valeur3 = GetNext();
                objet.Valeur4 = GetNext();
                objet.Valeur5 = GetNext();
                FinAlimenterValeurs(objet);
            }
     
            public static int GetNext()
            {
                lock (lockIndex)
                {
                    index++;
                    return index;
                }
            }
        }
    }

Discussions similaires

  1. [PowerBuilder] Création d'objets dynamiques
    Par Béné123456789 dans le forum Powerbuilder
    Réponses: 3
    Dernier message: 12/06/2006, 00h33
  2. Réponses: 3
    Dernier message: 08/09/2005, 10h45
  3. [JMenuBar] Création d'objets à la volée
    Par Rampa dans le forum Composants
    Réponses: 5
    Dernier message: 29/06/2005, 13h56
  4. [FLASH MX2004] Création d'objet dynamiquement
    Par noarno dans le forum Flash
    Réponses: 3
    Dernier message: 15/12/2004, 11h00
  5. Problemes de création en exécution
    Par popeyes dans le forum Composants VCL
    Réponses: 6
    Dernier message: 29/06/2004, 19h02

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