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

Dotnet Discussion :

[C#][Thread][Invoke] petit problème de delegate


Sujet :

Dotnet

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut [C#][Thread][Invoke] petit problème de delegate
    Hello,
    dans la série des galères matinales, j'ai un souci de delegate ...
    Tous les exemples que j'ai put trouver utilisent des threads déclarés dans la même classe.
    Là je dois utiliser un thread déclaré dans une classe autre que celle du Form1.

    En gros j'ai :

    Form1 qui instancie un objet 'client' qui lui lance un Thread ( la méthode de ce thread est définie dans une troisième classe).
    Le Thread doit pouvoir mettre à jour un datagrid présent sur la form1.
    Afin que mon Thread connaisse le Datagrid, je passe ce datagrid à ma classe client, qui le passe a son tour a ma classe clientThread. ( ca déjà ca doit pas être tiptop ? )

    J'ai donc écrit une méthode public dans ma classe Form1,
    public void UpdateDatagrid(ArrayList List){...}
    et un delegate
    public delegate void UpdateDataGridDelegate(ArrayList List);

    et j'appelle le delegate ainsi ( dans ClientThread ), avec dg le datagrid:
    dg.Invoke(new mainForm.UpdateDataGridDelegate(UpdateDatagrid), List);

    j'ai comme erreur :
    The name 'UpdateDatagrid' does not exist in the current context

    Moi je veux bien, mais il est public, il y a un delegate, je vois pas trop ce qu'il lui faut de plus ?

    un petit appercu des classes pour comprendre peut etre mieux que mon charabia, j'ai beaucoup simplifié le code, en ne gardant que ce qui me semblai t nécessaire à sa comprehension :
    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
     
        public partial class mainForm : Form
        {
    ...
            private Client clientAlarms;        
    public delegate void UpdateDataGridDelegate(ArrayList List);
    ...
            public mainForm()
            {
                InitializeComponent();
                InitializeApplication();
      ....
            }
     
     
     
     
     
            private void InitializeApplication()
            {
    ...
                clientAlarms = new ClientOptimAlarm(confMng.Server);
                clientAlarms.DataGrid = dataGrid1;
    ...
            }
     
            }
            public void UpdateDatagrid(ArrayList List) 
            {
                // au moins pour debug
                dataGrid1.DataSource = null;
                dataGrid1.Refresh();
                dataGrid1.DataSource = List;
                dataGrid1.Refresh();
            }
    }

    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
     
        class Client
        {
            private ClientThread thread;
            private Thread t;
           ...
            private DataGrid dg;
           ...
            public DataGrid DataGrid { set { dg = value; } }
           ...
     
     
            public void Connect()
            {
    .......
                    try 
                    {
                        thread = new ClientThread(ipEndPt);
                        thread.DataGrid = dg;
                        t = new Thread(new ThreadStart(thread.RetrieveAlarms));
                        t.IsBackground = true;
                        t.Start();
                    }
                    catch (Exception e)
                    {
                   ......
        }
     
     
    }

    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
    class ClientThread
        {
     
    ...
            private DataGrid dg;
    ...
            public DataGrid DataGrid 
            { 
                set 
                { 
                    dg = value; 
                } 
            }
    ....    
            private void AddAlarm(AlarmEventSlave Alarm, ArrayList List)
            {
     
                foreach (AlarmEventSlave al in List)
                {
                    if (al.IndexAlarmeEvent == Alarm.IndexAlarmeEvent)
                    {
                        List.Remove(al);
     
                        break;
                    }
                }
                List.Add(new AlarmEventSlave(Alarm));
     
                dg.Invoke(new mainForm.UpdateDataGridDelegate(UpdateDatagrid), List);
     
     
            }
     
        }

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    A mon avis tu t'emmeles un peu les pinceaux . Je ne commenterais pas le fait que tu ais 3 classes pour faire ce que tu fais, tu dois avoir tes raisons. Sur les erreurs de compilation que tu as :

    The name 'UpdateDatagrid' does not exist in the current context
    Effectivement dans ta classe ClientThread je ne vois nulle part de déclaré de variable ou de méthode UpdateDatagrid. Tu veux peut être parlé de la méthode UpdateDatagrid de ta Form1 ? Dans ce cas il faut passer cet objet à ta classe, pas en créer une nouvelle.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Oui, je dois m'embrouiller un peu avec tout ca, il y a pas mal de code derriere, et je n'y vois plus vraiment clair ...

    edit : oui effectivement, ma methode UpdateDatagrid est dans le Form1, mais je n'arrive pas à la passer au delegate en faisant Form1.UpdateDatagrid, il veut du static si je fait cela ...
    Or si cette méthode devient static, plus moyen de manipuler le datagrid dedans

    de plus je crois que je fais une conner** en faisait cela :
    je ferais certainement mieux de créer un évenement dans mon thread et de m'y abonner dans le thread form1 ? c'est possible d'ailleurs de s'abonner à des evenements provenant d'autres threads ?

    merci :-)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Problème résolu : c'été codé comme un pied ..;

    Désormais je gère tout par évènements.

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

Discussions similaires

  1. Petit problème avec un thread
    Par Nixeus dans le forum C#
    Réponses: 9
    Dernier message: 23/11/2010, 09h40
  2. Un petit problème avec les Threads
    Par Zikas-r dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 11/12/2008, 19h42
  3. Petit problème avec invoke
    Par bwarff dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/01/2008, 18h02
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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