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 :

[C#] Petit problème de synchronisation


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 177
    Par défaut [C#] Petit problème de synchronisation
    J'ai deux threads dans mon application, le général qui va s'occuper de l'interface graphique et des événements associés et un thread qui va lire un très gros fichier.

    Toutes les secondes (je vais augmenté ça plus tard), l'interface graphique mets à jour ses champs en fonction de ce qu'a lu l'autre thread. Le problème c'est qu'au bout d'un moment, le thread producteur ajoute un élément dans une liste que le lecteur est entrain de traiter. Comment faire pour ne pas soulever ce problème.

    Le lecteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private void raffraichirAffichage(){
    ...
            int index = 0;
    	listView.BeginUpdate();
    	listView.Items.Clear();
    	foreach (Toon t in l.getListeToon()) {
    		listView.Items.Add(t.Nom);
    		if (t.Nom.Equals(nomSelectione)) {
    			listView.Items[index].Selected = true;
    		}
    		index++;
    	}
    	listView.EndUpdate();
    }
    Le producteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    	agresseur = this.getListeToon().Find(Toon => Toon.Nom.Equals(nomAgresseur));
    	if (agresseur == null) {
    		agresseur = new Toon(nomAgresseur);
    		this.getListeToon().Add(agresseur);
    	}
    ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public ToonListe getListeToon() {
    	ToonListe ret = null;
    	lock (this.listeToon) {
    		ret = this.listeToon;
    	}
    	return ret;
    }
    Avec la méthode comme ça, le problème a lieu beaucoup plus tôt, comme si je perdais tous les avantages des threads

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    Je pense que lock est la bonne solution, mais il faut correctement l'appliquer.
    Donc le Lock doit entourer l'utilisation de la structure partagé et non l'accesseur à celui-ci.

    Le lecteur doit, lui aussi utiliser lock.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ToonListe toto = l.getListeToon();
    lock(toto)
    {
    	foreach (Toon t in toto ) {
    		....	
    		index++;
    	}
    }
    Il faudrait réduire au maximum la contention sur la structure, donc ne pas utiliser les propriétés des contrôles mais remplir des structures type liste de string pour les utiliser après la lecture et donc réduire aussi le temps de verrouillage de la structure.

    Pour le producteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ToonListe toto = l.getListeToon();
    lock(toto)
    {
    	agresseur = toto.Find(Toon => Toon.Nom.Equals(nomAgresseur));
    	if (agresseur == null) {
    		agresseur = new Toon(nomAgresseur);
    		toto.Add(agresseur);
    	}
    }
    Même chose que pour le code du consommateur, limitez les actions au minimum durant l'écriture, mais si vous avez besoin de cohérence dans la structure, ne libérez la structure que lorsque vous avez fini toutes les actions nécessaire à cette cohérence.
    Dans l'exemple, on se sert du contenu de la liste pour faire un choix sur ajouter ou non un élément, si cette condition ne doit pas varier entre la lecture de la liste et l'ajout, il faut garder le lock.

    Il faut d’abord avoir une solution correcte fonctionnellement avant de l'optimiser.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 177
    Par défaut
    ta méthode marche très bien, le problème c'est que j'ai doublé le temps avec le lock (enfin pas tout a fait vu que je diminue le nombre d'affichage qui doit prendre du temps).

    Bon, il faudrait que j'affine le temps de refresh, ça me permettra le "perdre" moins de temps

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    Comme je l'ai déjà indiqué, sortez tous les affichages de la boucle de lecture de la structure partagée.

Discussions similaires

  1. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  2. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  3. Problème de synchronisation dans un JTextArea
    Par wutang dans le forum Composants
    Réponses: 3
    Dernier message: 21/06/2004, 15h06
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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