Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Autres langages > [C#] thread agissant sur un form > Lecture du sujet

[C#] thread agissant sur un form

Vous devez être inscrit pour pouvoir poster des messages

RésoluLe problème de ce sujet a été résolu

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne lnsomnia # Posté le 29/06/2008 à 18:35:26
Groupe : Membres
Bonjour à tous,

j'ai un petit problème :p

Je souhaite qu'un form soit actualisé après x seconde par une thread. Alors j'ai fais des tests avant de faire cela mais j'ai un problème que je ne comprends pas trop. Je me suis inspiré de msdn pour faire ceci.

Code : C#
 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
32
33
34
35
public partial class Stats : Form
    {
        private Thread demoThread = null;
        public Stats()
        {
            InitializeComponent();
        }

        public void setLabel1(string tmp)
        {
            label1.Text = tmp;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }



        private void ThreadTest()
        {
            label1.Text = "test";
        }

        private void Stats_Load(object sender, EventArgs e)
        {
            demoThread = new Thread(new ThreadStart(this.ThreadTest));
            this.demoThread.Start();
        }




    }


Mais quand je lance ce form j'obtiens une erreur me disant : " Opération inter-threads non valide : le contrôle 'label1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé."

Je ne vois pas comment régler cela. Si quelqu'un aurait une idée.

C'est peut être une connerie mais bon.

Merci d'avance
Hors ligne SirJulio # Posté le 29/06/2008 à 18:51:10
Groupe : Membres
Dans .Net il ne faut pas toucher depuis un autre thread que son createur (cf appartment Com) donc fait ceci :

Code : C#
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
private void ThreadTest()
        {
            if (this.InvokeRequired)
                this.Invoke(new MethodInvoker(
                    delegate
                    {
                        label1.Text = "test";
                    }));
            else
                label1.Text = "test";
        }


En gros, on test si on est sur le thread createur de la form (invokeRequired), si non, on passe une fonction au thread createur (ici anonyme) par un délégué, si oui, on modifie simplement le label.
Hors ligne lnsomnia # Posté le 29/06/2008 à 18:54:43
Groupe : Membres
Ah ok. J'ai fait comme ça en java donc je me disais ça devrait marcher.

Mais j'ai fait comme tu m'as dis et ça marche super maintenant.

C'est pas la première fois que tu m'aides ;)

Merci bien pour cette aide précieuse :)

Retour au forum "Autres langages" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 157 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0525s (0.0376s)