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 TextBox impossible pour un timer/thread


Sujet :

C#

  1. #1
    Lucas Panny
    Invité(e)
    Par défaut Accès TextBox impossible pour un timer/thread
    Bonjour,

    J'ai trouvé un code pour implémenter un timer sous C#!
    http://www.codeproject.com/KB/cs/timeralarm.aspx

    Je ne sais pas si c'est parce que le code date de 2003 et qu'il ne marche plus sous VS2008 mais j'ai l'erreur suivante:
    Cross-thread operation not valid: Control 'timerInput' accessed from a thread other than the thread it was created on.
    Comment résoudre cela?

    Merci de votre compréhension

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 35
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Tu touches là le problème le plus embêtant des Thread... Tu veux accéder à un control exécuter dans un fil d'exécution à partir d'un autre fil d'exécution !

    Il faut donc utiliser une jolie méthode qui s'appel Invoke et les delegates

    Petit exemple :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
            private Thread monTimer;
     
            //ton constructeur ou une méthode que tu veux exécuter à un moment donnée
            public Form1()
            {
                //On insatncie le thread
                this.monTimer = new Thread(new ThreadStart(this.monTimer));
                //On le lance (ce qui va créer un autre fil d'éxecution)
                this.monTimer.Start();
            }
     
            delegate void DoInvoke();
            private void ModifierMaTextboxDepuisLeTimer()
            {
                this.MaTextBox.Text = "NouveauTexte";
            }
     
            /// <summary>
            /// Méthode qui va être exécutée dans un autre fil d'exécution 
            /// que celui de t'as textbox
            /// </summary>
            private void TonTimer()
            {
                while (true) //Le thread ne s'arrete jamais
                {
                    Thread.Sleep(1000); //On attend 1 seconde avant de continuer
                    //
                    this.Invoke(new DoInvoke(this.ModifierMaTextboxDepuisLeTimer));
                }
            }
    Si tu veux passer des paramètres dans la méthodes ModifierMaTextboxDepuisLeTimer demande moi car c'est un peu plus compliqué

  3. #3
    Lucas Panny
    Invité(e)
    Par défaut
    Dans le code que j'ai donné en lien, il n'utilise pas du Thread explicitement mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private System.Timers.Timer timerClock = new System.Timers.Timer();
    Ou est-ce que ce code est obsolète?

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 35
    Points : 42
    Points
    42
    Par défaut
    Non pas du tout Tu peux très bien utiliser mon exemple dans ton timer

    Lorsque tu voudras avoir acces à un control creer en dehors du fil d'execution du timer (par exemple ta textbox) utilise this.Invoke();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //exemple: 
    private void LevenementDeTonTimer(...) 
    {
          this.Invoke(new DoInvoke(ChangerLaTextbox));
    }
    Je t'es mis un exemple de thread pour que tu créer toi même ton propre timer sans passer par le timer

  5. #5
    Lucas Panny
    Invité(e)
    Par défaut
    Merci ivery07, je vais tester ton code et te faire un retour ici d'ici peu

  6. #6
    Max
    Max est déconnecté
    Expert éminent sénior

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Points : 14 933
    Points
    14 933
    Par défaut
    Salut.

    Un peu de lecture sur le sujet : make thread-safe calls to windows forms controls .

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/01/2017, 19h48
  2. Réponses: 1
    Dernier message: 13/03/2015, 07h36
  3. Réponses: 1
    Dernier message: 23/03/2013, 22h21
  4. Réponses: 11
    Dernier message: 10/01/2013, 10h11
  5. Réponses: 2
    Dernier message: 30/08/2011, 14h16

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