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ès à un contrôle depuis un thread


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2019
    Messages : 18
    Par défaut Accès à un contrôle depuis un thread
    Bonjour,
    Depuis ma MainForm je lance un thread en lui passant le handle de celle-ci.
    Mais je ne trouve pas le moyen depuis mon thread d'accéder aux contrôles de ma fenêtre principale.
    Par exemple je voudrais accéder au bouton "BtnTest" qui se trouve dans le panel "PnlTest"
    J'ai mis mon thread dans une classe
    Pour lancer mon thread je fais ceci
    Je lance ma classe depuis ma fenêtre principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     ClassThreadTest _ClassThreadTest = new ClassThreadTest();
    _ClassThreadTest.StartThreadTest(this);
    et ma classe est construite ainsi
    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
     
    internal class ClassThreadTest 
    {
       Thread ThModeTest;
       MainForm MainFormHandle ;
       public CancellationTokenSource _cancel;
       public void StartThreadTest(MainForm Parent)
       {
        MainFormHandle = Parent;
        ThModeTest= new Thread(LoopModeAuto);
        ThModeTest.Start();
       }
       private void LoopModeAuto()
       {
          while (!_cancel.IsCancellationRequested)
          {
             ...
          }
       }
    }
    Et à un moment donné j'ai besoin de modifier l'état Enable du contrôle qui se trouve dans ma fenêtre principale.
    Je ne trouve pas le chemin pour y accéder du style : "MainFormHandle.PnlTest.BtnTest.Enable = true;"
    J'ai aussi compris que j'allais avoir un problème d'accès inter-thread donc je pensais utiliser Invoke par exemple
    MainFormHandle.PnlTest.BtnTest.Invoke(new EventHandler(delegate { MainFormHandle.PnlTest.BtnTest.Enable = true;}));

    Merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 982
    Par défaut
    Sujet largement documenté.
    Par exemple :
    https://learn.microsoft.com/en-us/do...netdesktop-8.0

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2019
    Messages : 18
    Par défaut
    Je l'ai lu et j'ai vu le principe du invoke.
    Mais ça ne me donne pas le moyen d'accéder à mon contrôle depuis mon thread qui se trouve dans une classe.
    Car dans leur exemple le bouton, le textbox et le thread sont dans la même form.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2019
    Messages : 18
    Par défaut
    Bon ben j'ai trouvé plusieurs solutions :

    Solution 1 :
    créer une fonction public contenant le code avec le invoke dans la form principale. Appelez cette fonction depuis ma classe en utilisant le handle qu'elle a reçu .

    Solution 2 :
    Dans le designer de ma form, passer le contrôle à accéder en public et y accéder depuis ma classe en utilisant le invoke

    Je ne sais pas si c'est propre , mais ça fonctionne.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 29/04/2015, 23h51
  2. Accès à une méthode static depuis un thread
    Par fantomchris dans le forum MFC
    Réponses: 7
    Dernier message: 08/07/2009, 18h05
  3. Réponses: 1
    Dernier message: 25/03/2006, 17h53
  4. Accès serveur WEB depuis l'internet
    Par Ultra-FX dans le forum Réseau
    Réponses: 2
    Dernier message: 26/05/2005, 17h00
  5. acces à postgresql depuis windows
    Par webdoing dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 08/03/2004, 11h06

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