Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2005 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] changer texte label avec conflit de thread

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] changer texte label avec conflit de thread

n°1886457
Vings
Thèse, Antithèse, Charentaises
Posté le 20-05-2009 à 11:59:10  profilanswer
 

Salut,
 
J'ai un petit problème au niveau du changement de texte d'un label.
Je m'explique:
J'ai une WinForm qui comporte un Label et utilise une DLL en statique.
L'idée est à chaque clique d'horloge,appeler la fonction Update:
_Appeler la fonction getTemperature() (de la DLL) qui retourne un int,
_Convertir en string cette valeur et la mettre dans un Label de la Winform.
Le problème est qu'au premier clic d'horloge, Visual m'indique que mon application n'est pas ThreadSafe:
Voici le bout de code incriminé:
dans la classe formControl
public void Update()
{
string temp;
m_temperature = getTemperature();
temp = m_temperature.ToString();
this.temperatureValue.Text = temp;
}
L'erreur produite:
Opération inter-threads non valide : le contrôle 'temperatureValue' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
 
Je n'ai pas compris en quoi j'ai fais un conflit de threads. J'ai par ailleurs utilisé le lien de visual pour faire du multithreading de manière viable, mais je n'arrive pas a adapter le programme d'exemple pour un Label (il est pour une textBox), ce qui peut s'expliquer par mes faiblesses en ce qui concerne les delegate et Invoke.
 


---------------
"Il faut avoir bien du jugement pour sentir que nous n'en avons point."  
mood
Publicité
Posté le 20-05-2009 à 11:59:10  profilanswer
 

n°1886776
Ant1_
The game is rigged
Posté le 21-05-2009 à 08:27:08  profilanswer
 

Tu fais comment pour avoir les "clics d'horloge" ?
Apparemment t'as fait un truc à la mano avec un thread.

 

Tu peux pas utiliser le composant timer ? (ça se trouve dans la toolbox de VS).

 


Si vraiment c'est pas possible alors il faut que tu fasse un Form.Invoke :

 

MyEvent(...)
{
   Form.Invoke(new MethodInvoker(delegate  { Update(); } ));
}

 

Ca permet d'appeler la méthode Update avec le thread de l'UI. En effet, tu n'as pas le droit de modifier l'UI avec n'importe quel thread ;)


Message édité par Ant1_ le 21-05-2009 à 08:40:10
n°1886868
Vings
Thèse, Antithèse, Charentaises
Posté le 21-05-2009 à 19:23:19  profilanswer
 

Merci de ta réponse,
J'utilise un timer de Vs, c'était imagé. Pourrait tu m'expliquer ce que
 
Form.Invoke(new MethodInvoker(delegate  { Update(); } ));
 
va faire? J'ai assez de mal à piger le Invoke.

n°1886978
Vings
Thèse, Antithèse, Charentaises
Posté le 22-05-2009 à 10:32:59  profilanswer
 

En fait je n'utilise pas de thread d'horloge, c'est qui m'étonne que cela produise un conflit de thread!

n°1887736
ixemul
Nan mais sans blague ! ⚡
Posté le 25-05-2009 à 16:41:45  profilanswer
 

Quand est appelée ta méthode "Update()" ?

n°1888052
Vings
Thèse, Antithèse, Charentaises
Posté le 26-05-2009 à 14:43:47  profilanswer
 

à chaque coup d'horloge:
 
        public void Timer_Tick(object sender, EventArgs eArgs)
        {
            if (sender == this.timer)
            {
                Console.WriteLine("Timer_Tick" );
                this.Update();
               
            }
 
        }

n°1888053
Vings
Thèse, Antithèse, Charentaises
Posté le 26-05-2009 à 14:44:42  profilanswer
 

sachant que la fonction update se trouve dans formControl qui possède une instance de Timer.

n°1888062
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 26-05-2009 à 15:06:26  profilanswer
 

Alors, d'abord, je t'invite à lire cette page :
http://msdn.microsoft.com/en-us/li [...] timer.aspx
 
Et notamment ce passage :

Citation :


The method does not execute on the thread that created the timer; it executes on a ThreadPool thread supplied by the system.  


 
Ce qui veut dire que ta fonction Update() est exécutée dans un thread différent. C'est donc ce thread qui accéde au thread principal qui contient ton interface et ses contrôles, et ça, comme le dit Ant1_, c'est interdit, tu dois utiliser BeginInvoke(), qui aura pour effet de placer l'opération de mise à jour de ton controle dans une file d'attente.
 
Plus d'infos ici : http://www.codeproject.com/KB/cs/begininvoke.aspx


---------------
J'ai un string dans l'array (Paris Hilton)
n°1888087
Vings
Thèse, Antithèse, Charentaises
Posté le 26-05-2009 à 16:27:09  profilanswer
 

Merci infiniment!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] changer texte label avec conflit de thread

 

Sujets relatifs
[javascript] Rollover : changer une imageMulti Thread
Détection droits admin (C++)[C] Bus error, arbre et fichiers
programmation en C: les matricesthread problème
[C#] Faire une seule instance de dll pour deux programmesthread 'NoneType' object is not callable
[C] Probléme de récupération des données à travers ttyS (LINUX)[Menu déroulant / Javascript/ C# ]
Plus de sujets relatifs à : [C#] changer texte label avec conflit de thread


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR