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

Windows Forms Discussion :

[C#] probleme bête de modification d'un label


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut [C#] probleme bête de modification d'un label
    Bonjour,
    J'ai un chti soucis, qui a l'aire bête mais qui me bloque quand même...
    J'ai une form contenant des labels. Derrière ces interfaces, tourne une appli multithreadée.
    Je voudrais que certains threads aient la possibilité d'afficher des informations dans ces labels...

    Le soucis que j'ai c'est que, du fait que la méthode de modif du label est appelée depuis les threads, elle doit être publique. Comme c'est ma fiche principale correspondant au "main" de l'appli, la méthode doit être static. La méthode étant static, elle doit utiliser des attributs static ce qui ne dois pas être le cas de mes labels, puisque j'ai l'erreur à la compilation...

    Comment puis-je faire???

    Merci de votre aide

    PS: Voila le code de ma méthode...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static void incrementLogTotal(int i)
            {
                int j = Convert.ToInt32(MonLabel.Text);
                i = i + j;
                MonLabel.Text = i.ToString();
            }

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Points : 89
    Points
    89
    Par défaut
    Dans l'idéal, il faudrait que tes differents threads firent des events auxquels tu t'abonnerais pour appeler ta méthode incrementLogTotal() ...

    J'ai été clair?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    oui, c'est clair dans le principe, Mais je ne jamais fait ça...

    Je suis entrain de regarder MSDN, j'avance doucement.
    En fait, l'appli qui tourne derrière l'interface, c'est un socket qui reçoit des message. A la reception de chaque message il cré un thread qui va traiter le message reçu. Les info du message traité par le thread qui doivent s'afficher sur l'interface...

    Coté thread, je vois bien comment monter les evenements. La où je bloque, c'est pour le Listener...

    le problème revient à 3 classes A,B et C
    A instancie B et le lance dans un thread.
    B instancie C à la reception de chaque message et le lance dans un thread (donc plusieurs instances tournent en même temps )

    Le but c'est de remonté des evenements levés par les instance de C vers A.

    voila ce que j'essaye:
    du coté de C, je déclare dans ma classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static event EventHandler Reception;
    protected virtual void OnReception(EventArgs e)
        {
            if (Reception != null)
                Reception(this, e);
        }
    du coté A (donc interface)
    dans la méthode Load de mon interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C.ReceptionMsg += new EventHandler(incrementMsg);
    une méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void incrementMsg(object sender, EventArgs e)
            {
                int i;
                i = int.Parse(LeLabel.Text)+1;
                LeLabel.Text = i.ToString(); //c'est ici qu'il y a une erreur...
            }
    puis sur l'événement Closing:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C.ReceptionMsg -= new EventHandler(incrementMsg);
    Ca compile, les evenements sont bien levés, mais j'ai une erreur au niveau de la ligne signalée:
    System.InvalidOperationException was unhandled
    Message="Cross-thread operation not valid: Control 'LeLabel' accessed from a thread other than the thread it was created on."
    Source="System.Windows.Forms"
    StackTrace:
    at System.Windows.Forms.Control.get_Handle()
    at System.Windows.Forms.Control.set_WindowText(String value)
    at System.Windows.Forms.Control.set_Text(String value)
    at System.Windows.Forms.Label.set_Text(String value)
    at correlog_log_loader.fMain.incrementMsgTotal(Object sender, EventArgs e) in D:\Essai\Interface.cs:line 216
    at UnMsg.OnReceptionMsg(EventArgs e) in D:\Essai\UnMsg.cs:line 575
    at UnMsg.traite() in D:\Essai\UnMsg.cs:line 1342
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    at System.Threading.ThreadHelper.ThreadStart()
    Je ne comprend pas pourquoi... remarque, i contient la bonne valeur.

    Merci de ton aide

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    Je suis toujours dessus et je me demandais:
    Est ce que le problème peut venir du fait que l'evenement est en static?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    bon, ben je sais pas ce que ça vaut mais en rajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
    dans le code de la methode incrementMsg ça passe.
    Mais j'avoue, j'ai pas tout compris...

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

Discussions similaires

  1. Probleme avec la modification de graphes
    Par Belegeorn dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/07/2007, 14h28
  2. Réponses: 1
    Dernier message: 09/07/2007, 10h13
  3. Modification d'un label cliquable dans une même fenêtre
    Par simtim dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 29/04/2007, 13h07
  4. Réponses: 8
    Dernier message: 05/12/2006, 15h44
  5. Probleme SQL pour modification
    Par cmoimeme dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/08/2006, 19h57

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