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

Windows Forms Discussion :

Comment accèder aux composants graphique à partir d'un autre thread ?


Sujet :

Windows Forms

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 192
    Points : 144
    Points
    144
    Par défaut Comment accèder aux composants graphique à partir d'un autre thread ?
    Je reviens sur l'exemple donnée dans les FAQ :

    Code C# : 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
     
    private void LanceThread(object sender, EventArgs e)
    {
    ThreadStart operation = new ThreadStart(Fonction1);
     
    Thread LeThread = new Thread(operation);
     
    LeThread.Start();
    }
     
    private void Fonction1()
    {
    if( textBox1.InvokeRequired)
    textBox1.Invoke(new TextBoxInvokeHandler(FonctionTextBox));
    else
    FonctionTextBox();
    }
     
    private delegate void TextBoxInvokeHandler();
     
    private void FonctionTextBox()
    {
    textBox1.Text = "dans le thread";
    }
    Comment faire si la chaine "dans le thread" est un paramètre de la fonction LanceThread ?

    Merci

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut .

    Il faut modifier ton delegué pour lui communiquer les arguments qui t'interesse.

    Code C# : 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
     
    private void LanceThread(object sender, EventArgs e)
    {
    ThreadStart operation = new ThreadStart(Fonction1);
     
    Thread LeThread = new Thread(operation);
     
    LeThread.Start();
    }
     
    private void Fonction1(string text)
    {
    if( textBox1.InvokeRequired)
    textBox1.Invoke(new TextBoxInvokeHandler(FonctionTextBox), text);
    else
    FonctionTextBox(text);
    }
     
    private delegate void TextBoxInvokeHandler(string text);
     
    private void FonctionTextBox(string text)
    {
    textBox1.Text = text;
    }
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 192
    Points : 144
    Points
    144
    Par défaut
    Je ne comprends toujours pas comment passez le paramètre "string text" dans la méthode LancerThread à la méthode Fonction1.

  4. #4
    Membre habitué Avatar de Mourad
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 152
    Points : 161
    Points
    161
    Par défaut
    salut ben en fait il faut
    - soit que tu encapsules ta fonction dans une nested classe par exemple et que tu l'instancie en lui passant le paramètre text
    tu fais comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    myNestedclasse c = new myNestedclasse(text);
    new Thread (new ThreadStart (c.Fonction1)).Start();
    -soit tout simplement mettre text comme attribut de ta classe
    il n'y a pas de solution sans problème.

  5. #5
    Membre habitué Avatar de Mourad
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 152
    Points : 161
    Points
    161
    Par défaut
    ps :
    pour répondre à ta question, à ma connaissance on ne peut pas accéder à des contrôles à partir d'un autre thread, donc ce que j'ai expliqué, c'est juste comment passer la variable text.
    mais pour ce qui est de l'affectation à un textbox, je ne crois pas que c'est possible car ce textbox est crée normallement (si c'est ton cas) dans le thread principal et donc ou ne peut pas y accéder à partir d'un autre thread.
    il n'y a pas de solution sans problème.

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    sauf si tu fais CheckForIllegalCrossThreadCalls= true
    (dans le constructeur de ta form1 par exemple)

    c'est pas des "plus" propres, mais ca permet de changer un control depuis
    un autre thread

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 192
    Points : 144
    Points
    144
    Par défaut
    J'ai résolu le problème grace à l'encapsulation proposée par Mourad.

    Quand je veux mettre à jour ma textBox je fais appel à la classe myNestedclasse qui contient une textBox et une string.

    new myNestedclasse(textBox, text).

    Le constructeur affecte les deux attributs et lance le remplissage de la textBox en threadSafe via :

    new Thread (new ThreadStart (c.Fonction1)).Start();

    Le reste du code est similaire à celui proposé dans la FAQ.

    Merci

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/03/2010, 19h58
  2. comment accéder aux ressources locales à partir d'une appli web
    Par lginoux dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 01/04/2009, 10h46
  3. Réponses: 7
    Dernier message: 10/04/2008, 13h59
  4. Réponses: 5
    Dernier message: 11/09/2007, 11h32
  5. Comment accéder aux composants du module de données distant ?
    Par bds2006 dans le forum Bases de données
    Réponses: 1
    Dernier message: 23/06/2006, 00h47

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