none
Mettre à jour du texte dans des labels [threads] RRS feed

  • Question

  • Bonjour,

    J'ai une application windows form dans laquelle j'ai déclaré un thread :


    public partial class Form1 : Form
        {
            // Le thread
            protected static Thread _thListenCAN;


    Grâce à un clic sur un bouton, je lance le thread :

    private void button_StartCAN_Click(object sender, EventArgs e)
            {
                _thListenCAN = new Thread(new ThreadStart(ListenCAN));
                _thListenCAN.Start();
            }


    Ce thread est donc lié à la fonction "ListenCAN" déclarée comme ceci :

    private static void ListenCAN()

    Fonction dans laquelle je fais :

    labelAns_DataIn.Text = trameCan.getDataReceived();


    Cependant, j'obtiens comme erreur :

    Erreur	2	Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'WindowsForm.Form1.labelAns_DataIn'

    Comme tout marche en "static", je pense que c'est ce qui fait planter tout mon thread lorsque je lance l'application mais je ne vois pas comment mettre un label en static... 

    Si vous avez une solution à m'apporter, je suis toute ouïe !

    Merci d'avance et bonne fin d'après-midi.

    Cordialement,

    Manu.

    mercredi 17 juillet 2013 14:47

Réponses

  • Bonjour,

    Vous pouvez simplement ne pas placer votre méthode ListenCAN() en static, ainsi vous aurez accès au formulaire qui lance votre thread.

    Attention toutefois, les contrôles WinForms ne sont pas ThreadSafe par conséquent afin de modifier les propriétés d'un contrôle il faut retourner dans le thread qui a créer le contrôle. Pour cela on utilise les méthodes Invoke ou BeginInvoke de la classe Control. Ca pourrait ressembler à ca :

    private void ListenCAN() {
      String data = trameCan.getDataReceived();
      labelAns_DataIn.BeginInvoke((MethodInvoker)delegate {
        labelAns_DataIn.Text = data;
      });
    }
    
    

    Cordialement,


    Yan Grenier


    jeudi 18 juillet 2013 06:22

Toutes les réponses

  • Bonjour,

    En effet, le control labelAns_DataIn n'est pas static. Il est lié à l'instance de votre form. Vous pourriez essayer d'adapter la signature de votre méthode static ListenCan en lui passant une référence vers un label

    private static void ListenCAN(Label aLabel)
    et, dans votre méthode, utiliser aLabel.text pour lui assigner une valeur

    mercredi 17 juillet 2013 14:58
  • Merci pour la réponse.

    Je viens de modifier la signature de ma méthode static ListenCAN.

    Cependant, il me met (à juste titre) l'heure suivante :

    Erreur	2	Aucune surcharge pour 'ListenCAN' ne correspond au délégué 'System.Threading.ThreadStart'	D:\Programmation\C#\ApplicationTestFenetree\ApplicationTestFenetree\Form1.cs	1869	39	ApplicationTestFenetree
    

    Je me suis donc dit " il faut que je mette les paramètres passés à la fonction ListenCAN lors de la déclaration du thread et donc remplacer :

    _thListenCAN = new Thread(new ThreadStart(ListenCAN));

    Par :

    _thListenCAN = new Thread(new ThreadStart(ListenCAN(Label a, Label b, Label c, Label d)));


    Cependant, il ne m'accepte pas ceci non plus... Comment dois-je faire pour qu'il accepte mon nouveau prototype de ListenCAN ?

    mercredi 17 juillet 2013 15:14
  • Exact dans ce cas, utilisez le constructeur de la classe Thread qui prend un ParameterizedThreadStart. Vous trouverez un exemple d'utilisation sur msdn en suivant ce lien. J'espère que ca vous aidera.

    mercredi 17 juillet 2013 19:14
  • Bonjour,

    Vous pouvez simplement ne pas placer votre méthode ListenCAN() en static, ainsi vous aurez accès au formulaire qui lance votre thread.

    Attention toutefois, les contrôles WinForms ne sont pas ThreadSafe par conséquent afin de modifier les propriétés d'un contrôle il faut retourner dans le thread qui a créer le contrôle. Pour cela on utilise les méthodes Invoke ou BeginInvoke de la classe Control. Ca pourrait ressembler à ca :

    private void ListenCAN() {
      String data = trameCan.getDataReceived();
      labelAns_DataIn.BeginInvoke((MethodInvoker)delegate {
        labelAns_DataIn.Text = data;
      });
    }
    
    

    Cordialement,


    Yan Grenier


    jeudi 18 juillet 2013 06:22
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 19 juillet 2013 06:28