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

C# Discussion :

appel asynchrone dans le thread principal


Sujet :

C#

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Points : 110
    Points
    110
    Par défaut appel asynchrone dans le thread principal
    Bonjour,

    J'ai grand besoin d'aide!
    Voilà le problème:
    Je code un composant non graphique<----!!!! Ce composant ne doit pas être lié par n'importe quel moyen aux controls.
    Ce composant est multithreadé. Je lance des threads depuis le thread principal.
    Ces threads provoquent des évènements.
    Comment fait on pour que le thread principal transfert ces évènements à l'application qui utilise le composant sans tomber dans le problème du code unsafe?

    J'ai déjà fait un test de mon composant sur une appli console. Pas de problème, les threads génèrent des évènements qui sont très bien gérer pas la suite.

    Je teste avec une WinForm. Gros souci lorsque je fait un traitement sur les control de la Winform! L'erreur étant que le code de l'évènement essaye de modifier un control à partir d'un thread autre que celui qu'il l'a créé.

    Il existe une parade facile qui est d'utiliser la méthode Invoke du control dans le code de la winform. Cepandant, je voudrais que le multithreading de mon composant passe totalement inaperçu pour un utilisateur. Donc le Invoke doit se faire au niveau de mon composant. Or il n'existe pas de méthode Invoke() dans la classe Component. Une solution facile serait alors de changer Component en Control. Mais ça fait pas propre.

    Résumer:
    En gros, y a-t-il un moyen de recodé une méthode invoke c'est à dire faire une méthode qui permette depuis un thread secondaire de forcer le thread principale à executé une fonction (en l'occurence lancer un évènement).

    Si vous avez une solution, n'hésitez pas à mettre un code complet qui marche.

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    et si tu créeais un delegate dans ton composant et que tu faisais un invoke
    la dessus ca marcherait tres bien

    Heureusement qu'on peut faire des invoke sans avoir de controle...

    De mémoire, on trouve un ou plusieurs exemples dans le Msdn (mot clé BeginInvoke ou Invoke tout court

    The Monz, Toulouse

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Points : 110
    Points
    110
    Par défaut
    J'aurais besoin de cet exemple mais je ne le trouve pas!
    On tombe à chaque fois sur les méthodes de la classe Control

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Points : 110
    Points
    110
    Par défaut
    C'est bon!
    J'ai trouvé comment faire!
    Pour ceux que ca interresse voilà comment on fait:

    //On déclare un délégué
    public delegate void DelHandler(object sender, ClassEventArgs e);

    //on déclare un évènement
    public event DelHandler Del;

    //Méthode qui déclenche l'évènement
    protected virtual void OnDel(object sender, ClassEventArgs e)
    {
    if(Del.Target.GetType().IsSubclassOf(typeof(System.Windows.Forms.Control)))
    {
    Control tmpC = (Control)Del.Target;
    tmpC.Invoke(Del, new object[] {sender, e})
    }
    else
    {
    Del(sender, e);
    }
    }

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    ok.. et un truc comme ça, ca ne serait pas plus "simple" :

    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
     
    public delegate void Toto();
     
            public Form1()
            {
                InitializeComponent();
            }
     
            public void DoIt()
            {
                for (int i = 0; i < 100; i++)
                {
                    Thread.Sleep(100);
                }
                MessageBox.Show("fini");
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
     
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                Toto a = new Toto(DoIt);
                a.BeginInvoke(null, null);
            }

    The Monz, Toulouse

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Points : 110
    Points
    110
    Par défaut
    C'est plus simple, mais le but est de déclencher un évènement non pas quand le thread a terminer sont bazard mais lorsqu'une condition est vérifiée! Et le MessageBox.Show() n'est pas souhaitable car un utilisateur du composant ne souhaitera peut-être pas voir de fenêtre intempestive surcharger son écran.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 49
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Mon problème se rapproche de celui-ci...

    J'ai un thread principal qui lance un thread "scan" qui s'occupe via des objets de type FileSystemWatcher de scruter des dossiers. Lorsqu'un nouveau fichier est détecté dans le dossier A, je crée un objet dans une ArrayList, et lorsqu'un nouveau fichier est détecté dans le dossier B, je crée un objet cette fois-ci dans une queue.

    Je souhaiterai chaque fois que je mets à jour mon ArrayList ou ma Queue mon DataGridView se mette à jour... comment puis-je procéder?

    Edit: problème résolu en utilisant un délégué.

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

Discussions similaires

  1. [QThread] Comment attendre une information d'un thread dans le thread principal ?
    Par f.denis dans le forum Multithreading
    Réponses: 5
    Dernier message: 15/04/2010, 11h57
  2. Réponses: 5
    Dernier message: 10/07/2009, 22h43
  3. [GLib] Interrompre un appel bloquant dans un thread
    Par Zorgblub dans le forum Réseau
    Réponses: 3
    Dernier message: 17/11/2007, 18h02
  4. [C++/CLI] Méthode cyclique dans thread principal
    Par Plio dans le forum C++/CLI
    Réponses: 4
    Dernier message: 09/10/2007, 15h19
  5. Appel de Jsp d'un second projet dans un projet principal
    Par shaun_the_sheep dans le forum Eclipse Java
    Réponses: 8
    Dernier message: 21/09/2006, 11h04

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