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 :

[.Net 2] Multithreading


Sujet :

Windows Forms

  1. #1
    Invité
    Invité(e)
    Par défaut [.Net 2] Multithreading
    J'essaie de faire une petite application multithreading afin de pouvoir mieux comprendre comment ça fonctionne. Néanmoins, bien que je commence à être pas si mal niveau compréhension, je n'arrive toujours pas à faire quelque chose de très simple, c'est en fait de créer un nouveau thread .... avec certains paramètres.

    En somme, on peut créer une classe ce qui n'est pas un problème, mais comment peut on faire pour envoyer un paramètre à cette classe comme un constructeur ( du genre Maclasse objet = new Maclasse("param1", "param2"); ) J'ai bien pu voir plusieurs tutoriels sur google ou même ici notamment sur le backgroundworker qui semblent intéressant, néanmoins aucun ne traite d'envoyer des paramètres...

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu peux utiliser le delegate ParameterizedThreadStart à la place de ThreadStart. Ca ne prend qu'un objet en paramètre, mais tu peux (par exemple) créer une classe qui encapsule les paramètres de ton thread, et passer une instance de cette classe à Thread.Start :
    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
     
    private void MonThreadStart(object parameter)
    {
        MesParametres prm = parameter as MesParametres;
        // le traitement ici
    }
     
    ...
     
    public void DemarrerThread()
    {
        MesParametres prm = new MesParametres("hello", "world", 42);
        monThread = new Thread(new ParameterizedThreadStart(MonThread));
        monThread.Start(prm);
    }
    Tu peux aussi utiliser le BackgroundWorker selon le même principe, en passant les paramètres sous forme d'un objet passé à la méthode RunWorkerAsync. C'est un peu plus simple à utiliser qu'un simple thread (à mon avis), notamment si ton thread doit intervenir sur l'interface graphique (qui ne peut être modifiée que par le thread qui l'a créée)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Normalement je vais en faire un service donc le GUI ne seras pas en cause. C'est intéressant à voir cette méthode je vais faire des tests. Par interface on implique autant dos que winforms ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Chasseur d'étoiles Voir le message
    Par interface on implique autant dos que winforms ?
    Non, seulement les interfaces graphiques (WinForms, WPF), pas la console.

  5. #5
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Personnellement je n'apprécie pas trop la méthode proposée par tomlev (bien qu'elle soit pertinente).

    Le problème c'est que les paramètres ne sont pas typés, et rien n'est vérifié à la compilation ce qui selon moi, est source potentiel de problèmes de maintenance.
    J'ai donc tendance à utiliser cette approche là :

    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
     
    public class MonThread
    {
        string monParam1;
        int monParam2;
     
        public MonThread (string monParam1, int monParam2)
        {
            this.monParam1 = monParam1;
            this.monParam2 = monParam2;
        }
     
        public void Run()
        {
            // utiliser les paramètres ici
        }
    }
    Puis dans une autre classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MonThread montrd = new MonThread( "hello", 42);
    new Thread (new ThreadStart (montrd.Run)).Start();
    Elle permet de passer les paramètres de façon fortement typée...
    Une autre solution :

    Si tu veux pas passer par un objet externe, tu peux aussi utiliser un delegate pour déclarer une méthode anonyme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ThreadStart starter = delegate { Run ("Hello", 42); };
    new Thread(starter).Start();
    Dans ce cas aussi, le type et le nombre des paramètres sont vérifiés a la compilation, donc si tu changes la méthode exécutée et que les paramètres envoyés ne correspondent plus aux paramètres attendus, tu t'en rends compte plus facilement. Ne sous-estimez jamais l'importance du typage.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bonne approche en effet, surtout celle avec le delegate anonyme.
    Je me demande s'il n'y aurait pas moyen de faire encore mieux, en utilisant des génériques... je vais y réfléchir

  7. #7
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Sa peut marcher je pense si je remplace ceci...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ThreadStart starter = delegate { Run ("Hello", 42); };
    new Thread(starter).Start();
    par cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new Thread(()=>Run("Hello",42)).Start();
    Enfin les expressions lambda c'est du C#3, faut voir avec quelle version il travaille...

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par harz62 Voir le message
    Sa peut marcher je pense si je remplace ceci...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ThreadStart starter = delegate { Run ("Hello", 42); };
    new Thread(starter).Start();
    par cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new Thread(()=>Run("Hello",42)).Start();
    Enfin les expressions lambda c'est du C#3, faut voir avec quelle version il travaille...
    Pas mal aussi... en plus ça reste assez lisible

  9. #9
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je me demande s'il n'y aurait pas moyen de faire encore mieux, en utilisant des génériques... je vais y réfléchir
    Peut être en rendant la méthode Run générique, dans ce cas on pourrait avoir une inférence de type lors de l'appel de celle ci

  10. #10
    Invité
    Invité(e)
    Par défaut
    Intéressant. Mais bon je travaille en .Net 2.0 donc le 3 c'est pas pour tout de suite. À moins qu'il n'apporte de significatifs changement niveau performance... à voir. Le fait est que ce sera un service que je vais utilise sur un VPS donc à la limite ça peut être n'importe quelle version mais il faut quand même que le changement en vaille la peine.

  11. #11
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Par contre les méthodes anonymes c'est du C#2 donc tu peux utiliser

    Il me semble qu'avec la version 2.0 on gagne 3s comparé à du .NET 1.1 alors peut être que C#3 est plus rapide que le 2en tout cas je pense la CLR Performance Team s'y emploie...

  12. #12
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Citation Envoyé par harz62 Voir le message
    Peut être en rendant la méthode Run générique, dans ce cas on pourrait avoir une inférence de type lors de l'appel de celle ci
    Oui pour le type des paramètres, mais reste leur nombre...

  13. #13
    Invité
    Invité(e)
    Par défaut
    Et bien tout semble bien fonctionner très bien. Donc [Résolu] !

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

Discussions similaires

  1. vb.Net et Multithread
    Par khouja dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/04/2009, 13h40
  2. [C# .NET 2] FolderBrowserDialog en MultiThread
    Par smyley dans le forum Contribuez
    Réponses: 12
    Dernier message: 19/02/2009, 09h57
  3. [VB.NET 2.0] Serveur en MultiThreading
    Par Aspic dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/03/2007, 12h46
  4. Réponses: 2
    Dernier message: 24/03/2006, 10h18
  5. [VC6.0][.NET]MultiThread et MultiProcesseur ?
    Par matazz dans le forum MFC
    Réponses: 3
    Dernier message: 19/09/2005, 10h50

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