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 :

Accèder aux propriétés d'un autre thread


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut Accèder aux propriétés d'un autre thread
    Bonjour tous le monde,

    J'aurais aimé avoir quelques explication sur les thread.
    Je sais à quoi sert les thread mais je n'ai pas saisie quelque subtilité.

    Par exemple, j'ai un formulaire windows ou des propriétés sont déclarées dont un thread.

    A partir de ce thread je vais pouvoir accéder à certaines propriétés de mon windows form.

    Mais quand je vais vouloir accéder à une progress bar ou une textbox à travers ce thread, je n'y ai pas l'accès. J'ai donc une erreur qui me dit qu'à partir de mon thread je n'ai pas accès au élèments d'un autre thread.

    Pourquoi dans un cas on me dis que ça appartient à un autre thread et dans l'autre ça fonctionne ?

    Et comment accéder aux élèements d'un autre thread ?
    J'ai vu du côté des dispatchers mes je n'ai pas vraiment compris comment cela fonctionne.

    Merci d'avance.

  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
    un thread peut lire quasiment tout
    par contre un thread ne peut pas écrire une propriété sur un control si ce n'est pas lui qui a créé le control (form hérite de control)
    en général tous les controls sont créés par le thread principal


    pour pouvoir écrire sur un control depuis un thread, il faut donc dire au thread principal de le faire

    en théorie il faut alors utiliser un délégué (pointeur vers un void) et dire à un control d'appeler se délégué sur son thread
    monform.invoke(mondélégué)
    (ou begininvoke, invoke attend que l'appel du délégué soit fini pour passer à la suite, begininvoke met l'appel sur la pile et continu)

    ou alors utilier le composant backgroundworker trouvable dans la boite à outils ; ce composant est une encapsulation de tout ce qu'il faut pour faire du multithreading simple
    il a 2 event qui sont sur le thread principal :
    - reportprogress que tu peux déclencher via un void et donc passer des paramètres via cet event (c'est as object, tu peux mettre ce que tu veux donc, à caster derrière pour l'utiliser)
    - et un event pour dire que c'est fini (là aussi tu peux passer quelque chose)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Points : 275
    Points
    275
    Par défaut
    je pense que ton problème est plutôt l'accès aux propriétés créées dans le thread principal, càd, le thread chargé de la GUI qui, dans les winforms est chargé de la "boucle principale" et qui gère tout ce qui est graphique principalement

    c'est ça le problème le plus courant : tu crées un thread qui essaye d'accéder aux controls du winforms pour les mettre à jour par exemple,

    une technique courante pour contourner le problème est de tester si le control peut être appelé directement via la propriété InvokeRequired
    par exemple pour mettre à jour une textbox depuis n'importe quel thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public delegate void delegateUpdateTextBox(string text);
     
    public void updateTextBox(string text){
        if(this.maTextBox.InvokeRequired){
            delegateUpdateTextBox deleg = new delegateUpdateTextBox(this.udateTextBox);
            this.Invoke(deleg, new object[]{text});
        }else{
            this.maTextBox.Text = text;
        }
    }

  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
    et sur le framework 3.5 on est même pas obligé de déclarer un délégué, on peut invoker un new action qui pointe sur le void
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Points : 275
    Points
    275
    Par défaut
    c'est vrai, je ne connaissais pas la classe Action
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     public void setText(string txt)
            {
                if (this.label1.InvokeRequired)
                {
                    this.label1.Invoke(new Action<string>(this.setText), new object[] { txt });
     
                }
                else
                {
                    this.label1.Text = txt;
                }
            }

  6. #6
    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
    On peut faire plus général avec les méthodes anonymes et le délégué MethodInvoker ou Action (version non générique, FW 3.5 mini), la signature étant identique.

    Quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void InvokeMethod(MethodInvoker invoker)
    {
        if (this.InvokeRequired) 
        {
            this.Invoke(invoker);
        }
        else
        {
            invoker();
        }
    }
    Et à l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InvokeMethod(delegate { this.textBox.Text = monTexte; });
    Ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InvokeMethod(delegate { this.button.Visible = false; });
    Comme ça une seule méthode gère l'invoke, quel que soit le code à exécuter sur le thread principal.
    Pas de questions techniques par MP

  7. #7
    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
    ah oui c'est pas mal
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut
    Merci de vos réponse.

    Le seul problème est que je n'ai pas accès aux propriétés invoke et InvokeRequired(sur aucun des contrôle de mon form)

  9. #9
    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
    j'ai pas souvenir que c'est protected, mais essaye sur this à tout hasard

    this.invokerequired
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut
    j'ai déjà essayé sur this, mais aucun résultat...

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut
    J'ai trouvé pourquoi.

    J'utilise du wpf et non des windows form.

    Quelles méthode utilisés en wpf ?

  12. #12
    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
    lol pourtant sur ton premier poste tu parles de windows forms ...


    en wpf c'est une histoire de dispatcher, tu peux demander si le current dispatcher est le dispatcher du controle, si non tu invoke sur le dispatcher
    j'ai pas la syntaxe exacte en tete mais le pattern est le meme
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [Débutant] Accéder aux propriétés de MainWindow depuis une autre fenêtre
    Par Faguoren21 dans le forum C#
    Réponses: 7
    Dernier message: 25/04/2014, 20h02
  2. [Débutant] C# Comment accéder aux propriétés des contrôle sur un autre formulaire
    Par Claude_Azoulai dans le forum Visual Studio
    Réponses: 0
    Dernier message: 03/04/2013, 17h04
  3. Réponses: 22
    Dernier message: 17/12/2010, 18h07
  4. [C#]Accéder aux propriétés d'un User Control
    Par djoao dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/03/2006, 09h54
  5. [css] acceder aux propriétés d'un autre objet
    Par bakonu dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 21/10/2005, 12h28

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