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 :

Communication entre threads


Sujet :

C#

  1. #1
    Membre régulier
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Points : 119
    Points
    119
    Par défaut Communication entre threads
    Bonjour à tous

    Je voudrais savoir s'il était possible d'appeler une méthode d'un objet créé dans un thread à partir d'un autre thread ? Si oui, comment puis-je procéder ?

    Le thread en question est créé "manuellement", avec quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    myThread = new Thread(() =>
                {
     
                    MyClass obj = new MyClass();
     
                    // traitement
     
                });
     
               myThread .Start();
    Et je voudrais pouvoir, à partir de l'endroit où j'ai créé ce thread, lancer des méthodes de obj, si possible en lui passant un paramètre

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Pour moi il faut que ton objet obj soit créé dans le Thread principal et avant le lancement de tes 2 threads secondaires.
    Sinon ils ne peuvent pas le connaitre.

    Après tu veux faire quoi ? explique un peu pour voir.

  3. #3
    Membre régulier
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Points : 119
    Points
    119
    Par défaut
    En fait je suis en WPF et une partie de mon interface met beaucoup de temps à se charger (une partie des données à charger provient d'une base de données sur un serveur distant, etc etc) et je voudrais instancier une nouvelle fenêtre qui indiquerait la progression du chargement.

    Le problème c'est que, forcément, ma nouvelle fenêtre se freeze également puisque le thread UI est occupé à charger l'autre fenêtre.

    Je voudrais donc instancier cette nouvelle fenêtre dans un autre thread UI, je sais que c'est possible mais je n'ai pas bien compris la démarche : Comment je fais pour rappeler ma fenêtre dans le nouveau thread pour lui dire de rafraichir la progressBar ?

    (voir exemple ici et ici)

    J'ai vu également cet exemple mais idem, je ne vois pas bien comment l'appliquer à mon cas

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Je voudrais donc instancier cette nouvelle fenêtre dans un autre thread UI,
    Il n'y qu'un seul "Tread UI" ou "Main Thread" en .NET

    En fait je suis en WPF et une partie de mon interface met beaucoup de temps à se charger (une partie des données à charger provient d'une base de données sur un serveur distant, etc etc) et je voudrais instancier une nouvelle fenêtre qui indiquerait la progression du chargement.
    L'approche de créer un thread est bonne, par contre ce thread ne servira qu'a charger les données.
    Pour gérer l'affichage de la progression, le thread travaillant peut envoyer des événement dans le "Thread UI" (SynchronizationContext en Winform, Dispatcher en WPF).

    En Winform il y a le Backgroundworker pour gérer toute la mecanique d'événement entre le thread travaillant, et le thread UI.
    Pour WPF, je pense qu'une simple Task avec le bon Dispatcher devrait suffire.

  5. #5
    Membre régulier
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Points : 119
    Points
    119
    Par défaut
    On peut créer plusieurs thread UI en WPF, voir les liens que j'ai déjà indiqué

    http://msdn.microsoft.com/library/ms741870.aspx (partie "Multiple Windows, Multiple Threads")

    http://stackoverflow.com/questions/5...le-gui-threads

    http://msdn.microsoft.com/fr-fr/vstudio/cc563816.aspx (partie "Rendre l’application multi-threadée")

    http://eprystupa.wordpress.com/2008/...le-ui-threads/

  6. #6
    Membre régulier
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Points : 119
    Points
    119
    Par défaut
    j'ai finalement trouvé comment faire communiquer mes deux threads ui

    Je n'y arrivais pas parce que je n'avais pas bien saisi où chaque référence devait se trouver :

    Dans le MainWindow.cs :

    C'est là qu'il faut garder la référence vers la nouvelle fenêtre et le thread qui lui sera propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private MyWindow _window;
    private Thread _newUiThread;
    On place ensuite le code qui va instancier la fenêtre dans une méthode privée à part, méthode qui sera passée en tant que StartingPoint du thread:

    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
     
    private void ThreadStartingPoint()
            {
                // Create and show the Window
                _window = new MyWindow();
                _window.SetText("Loading workflow ...");
                _window.SetProgressBarValue(0);
                _window.Show();
     
               // Cette ligne permet d'eviter de se retouver avec un thread qui tourne pour rien une fois la fenêtre fermée
                _window.Closed += (sender, e) =>
                     _window.Closed.Dispatcher.InvokeShutdown();
     
                // Obligatoire pour faire du thread un thread UI (en + de le setter en STA)
                System.Windows.Threading.Dispatcher.Run();
            }
    Enfin, la création du thread (au moment où on doit afficher la fenêtre ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                // Create new UI thread to host the report progress window
                _newUiThread = new Thread(new ThreadStart(ThreadStartingPoint));
                _newUiThread.SetApartmentState(ApartmentState.STA);
                _newUiThread.IsBackground = true;
                _newUiThread.Start();
    Dans le .cs de la fenêtre à instancier dans son propre thread (ici MyWindow):

    Il faut ajouter une propriété de type Dispatcher que l'on set dans le constructeur, c'est cette propriété qui nous permettra d'invoquer les méthodes de la classe depuis le MainWindow.cs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public Dispatcher MyDispatcher
    {
            get;
            private set;
    }
     
    public MyWindow()
    {
            InitializeComponent();
            MyDispatcher = Dispatcher.CurrentDispatcher;
    }
    Exemple d'appel d'une méthode de MyWindow depuis MainWindow, ici pour appeler la méthode SetProgressBarValue qui reçoit un double :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    delegate void VoidDoubleMethod(double value);
    VoidDoubleMethod del = new VoidDoubleMethod(_window.SetProgressBarValue);
                    _window.MyDispatcher.Invoke(del, new object[] { value });
    Et voila, ma fenêtre ne freeze plus pendant que la première se charge tranquillement

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

Discussions similaires

  1. [C#] Communication entre thread
    Par kekesilo dans le forum Windows Forms
    Réponses: 11
    Dernier message: 17/09/2007, 19h48
  2. [thread] communication entre threads
    Par untipy dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 30/08/2007, 15h47
  3. Problème de communications entre threads
    Par maya09 dans le forum Windows
    Réponses: 1
    Dernier message: 22/02/2006, 22h18
  4. Communication entre thread
    Par JFPS Soft dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 03/02/2006, 17h38
  5. [c#][threading] communication entre threads
    Par orelero dans le forum C#
    Réponses: 6
    Dernier message: 02/01/2006, 00h42

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