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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 43
    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 : 43
    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 : 41
    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 : 43
    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 : 38

    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...

+ 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