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

Silverlight Discussion :

Dispatcher et TabControl.Items.Remove - Accès inter-threads non valide


Sujet :

Silverlight

  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Par défaut Dispatcher et TabControl.Items.Remove - Accès inter-threads non valide
    Bonjour,

    Je vous explique tout d'abord ma situation pour mieux comprendre mon besoin :
    J'ai un TabControl géré de manière dynamique. Donc avec :
    • Une méthode permettant de créer des nouvelles TabItems.
    • Une méthode permettant de supprimer les TabItems

    Le problème survient lors de la suppression d'un Item du TabControl.
    Ceci pour une bonne raison : Je demande la suppression de l'Item alors que la méthode synchrone que j'appelle pour la suppression se trouve justement dans l'item (du Content) qui doit être supprimé.

    Pour résoudre ce problème je me suis donc dit :
    J'utilise un thread (ou timer) qui se charge de la suppression du TabItem, comme çà la TabItem n'a pas besoin d'attendre la fin du thread pour terminer son traitement.
    Bref ...

    Donc l'objectif finale est de pouvoir faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabControlConversation.Items.Remove(monItem);
    Je me retrouve avec une méthode appelé par le code du Content du TabItem :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       Thread thTueurDeConversation;
        Conversation conversationASupprimer;
        public void cmdQuitterConversation(Conversation laConversation)
        {
            conversationASupprimer = laConversation;
            thTueurDeConversation = new Thread(new ThreadStart(ThreadTueur));
            thTueurDeConversation.Start();
         }
    Dans ma méthode ThreadTueur j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void ThreadTueur()
    {
    this.Dispatcher.BeginInvoke(delegate { tabControlConversation.Items.Remove(monItem); });
    }
    J'ai également essayé comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void ThreadTueur()
    {
       this.Dispatcher.BeginInvoke(new ChangerTabControlItem(ChangerTabControl), monItem);
    }
    private delegate void ChangerTabControlItem(TabItem monItem);
    private void ChangerTabControl(TabItem monItem)
    {
      tabControlConversation.Items.Remove(monItem);
      MessageBox.Show("Remove terminé");
    }
    Et dans tout les cas j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Accès inter-threads non valide
    Une idée ?
    Merci.

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Un TabItem peut tres bien se supprimer lui-meme je vois pas pourquoi tu passes par un systeme de thread pour faire ca.

    Le fait de supprimer un TabItem d'un TabControl c'est juste visuel, l'objet existera encore jusqu'a ce que le garbage collector passe par la.

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Par défaut
    Bonjour Skyounet,

    C'est ce que je me chargeait d'effectuer au départ, mais avec en addition la destruction de l'objet associé ainsi que du Content du TabItem (qui était un UserControl).
    J'avais donc une erreur lors de la destruction, de la même sorte que "accès inter-threads non valide".

    Mais grâce à toi, je suis revenu sur mes pas, tout en oubliant la destruction des objets concernés. Donc tout fonctionne =)
    Il est dans mon intérêt de détruire les objets associés, mais à défaut de destruction je me contente d'arrêter les tâches incluses dans le "Content" avant de supprimer le TabItem de l'affichage.

    Merci pour ton aide.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/03/2014, 19h53
  2. Opération inter-threads non valide VB.NET
    Par airemax dans le forum VB.NET
    Réponses: 2
    Dernier message: 01/05/2011, 11h51
  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