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 :

[2.0][C#] thread, forms et une belle erreur de crossthread


Sujet :

Windows Forms

  1. #1
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut [2.0][C#] thread, forms et une belle erreur de crossthread
    Bonsoir,

    le sujet à deja été traité sur le forum mais même avec ces post je bloque et appel à l'aide.

    Le contexte c'est une appli client/serveur en remoting, et en fait j'execute une action coté client, cette action envoie un signal au serveur pour declencher un evenement sur mes clients abonnés.

    Le problème c'est qu'au retour de l'evenement, sur le client, j'ai besoin de mettre à jour des controls sur mon form avec la méthode Tv_AjouteGroupe... C'est la que le drame commence

    Voici ce que j'ai fait pour essayer de palier, mais cela ne fonctionne point.
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using WebsiteManagement.Entite_site;
    using IEntiteSite;
    using System.Threading;
     
    namespace WebsiteManagement
    {
        public partial class Form1 : Form
        {
     
    		// Ce délégué est utilisé pour appeler des méthode 
    		// depuis un thread non autorisé à appeler ces méthodes.
    		public delegate void SafeCallBack_Tv_AjouteGroupe(string nom, IGroupe g);
     
    		void EntiteSiteList_OnAddedIGroupe(GroupListEventArgs MyEvent)
    		{
     
    			if (this.InvokeRequired)
    			{
    				SafeCallBack_Tv_AjouteGroupe d = new SafeCallBack_Tv_AjouteGroupe(Tv_AjouteGroupe);
    				this.Invoke(d , 
    							new object[] { 
    								"Nouveau groupe ()",
    								MyEvent.Groupe
    								}
    						);
    			}
    			else
    			{
    				// Un nouveau groupe à été ajouté
    				// Ajout d'une nouvelle Node avec un nom par défaut
    				this.Tv_AjouteGroupe(
    					"Nouveau groupe (" + this.treeView1.Nodes.Count.ToString() + ")"
    					, MyEvent.Groupe);
    			}
     
    			/*
    			// Un nouveau groupe à été ajouté
    			// Ajout d'une nouvelle Node avec un nom par défaut
    			this.Tv_AjouteGroupe(
    				"Nouveau groupe (" + this.treeView1.Nodes.Count.ToString() + ")"
    				, MyEvent.Groupe);*/
    		}
     
     
            private void button1_Click(object sender, EventArgs e)
            {
    			// demande de création d'un nouveau groupe au serveur
    			this.GroupeSiteList.CreateGroup();
    			// La suite se passe dans le retour d'evenement
    			// EntiteSiteList_OnAddedIGroupe
            }
     
            /// <summary>
            /// Méthode qui ajoute un nouveau groupe,
            /// donne le focus à la nouvelle Node, 
            /// puis active son état d'édition.
            /// </summary>
            private void Tv_AjouteGroupe(string nom, IGroupe g)
            {
    			System.Windows.Forms.TreeNode Tn = new TreeNode(nom);
    			Tn.Name = nom;
    			Tn.Tag = g;
    			Tn.ContextMenuStrip = this.contextMenuStrip1;
    			this.treeView1.BeginUpdate();
    			this.treeView1.Nodes.Add(Tn);
    			this.treeView1.EndUpdate();
    			this.treeView1.Focus();
    			Tn.BeginEdit();
    	} 
     
        }
    }
    Comme vous pouvez le voir j'ai créé un delegate et j'ai appelé la méthode invoke, bref à pirori rien d'extraordinaire...
    Mais sa plante lamentablement, je n'ai même plus de message d'erreur depuis le debuggeur(c'est pour vous dire).
    Je suis obligé de l'arréter come un boeuf

    Si vous avez besoin d'informations en plus, d'éclaircissement ect, faites le moi savoir.

    Merci,

    bye

  2. #2
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Ok, j'ai fini par trouver.... Par contre j'apprécierais une explication si quelqu'un peut me la donner.

    en faits j'ai juste du rempalcer This.Invoke(d, ect); pas this.BeginInvoke(d,ect);

    Trop dur ca faisait 2 heures que j'était dessus pour seulement sa.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 31/01/2010, 11h45
  2. [Thread]Creation d'une form
    Par 0x44-0x43-0x53-0x43 dans le forum Langage
    Réponses: 7
    Dernier message: 20/11/2009, 09h57
  3. Création d'une Form dans un thread (form dynamique)
    Par franco263 dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/06/2007, 17h33
  4. [Thread] comment arreter un thread qui execute une methode b
    Par Cyber@l dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 04/08/2004, 10h51
  5. Réponses: 10
    Dernier message: 30/06/2004, 13h00

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