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 :

Thread avec argument


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 13
    Par défaut Thread avec argument
    Bonjour à tous,

    J'ai un petit souci pour appeler un thread avec des arguments.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Thread t1 = new Thread(new ThreadStart(fonction 1(arg1,arg2,arg3));
    t1.Start();
    Comment puis-je faire pour appeler ma fonction?
    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 34
    Par défaut
    e délégué ThreadStart ne permet pas de passer directement des paramètres à ton thread!
    Lis ce cour et tu auras une bonne idée sur les threads:
    cour_emerica_thread

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 13
    Par défaut
    Merci beaucoup, je vais lire cela tout de suite

  4. #4
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Faudrait commencer par lire la documentation
    Ça n'a pas de sens de connaitre des cours par cœur, faut avant tout apprendre à chercher une documentation.

    On ne peut passer qu'un seul argument à un Thread, donc si tu veux passer tout plein d'info, bah tu créer un objet qui va pouvoir réunir toutes ces infos et tu passe cet objet, ou tu utilise des trucs comme une Hashtable, un Dictionary, etc..

  5. #5
    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 ctxnop Voir le message
    Ça n'a pas de sens de connaitre des cours par cœur, faut avant tout apprendre à chercher une documentation.
    +1000 !

    Pour passer des arguments à un thread, il y a plusieurs approches possibles

    • créer une classe qui représente la tâche à exécuter, avec les valeurs des paramètres et une méthode (par exemple "Run"), et utiliser cette méthode Run comme point d'entrée 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
      17
      18
      class TaskWithParams
      {
          pubilc int Start { get; set; }
          public int End { get; set; }
       
          public void Run()
          {
              for(int i = Start; i <= End; i++)
              {
                  ...
              }
          }
      }
       
      ...
       
      var task = new TaskWithParams { Start = 0, End = 42 };
      new Thread(task.Run).Start();
      C'est un peu la méthode "bulldozer", mais dans certains cas ça peut être pratique
    • Autre approche un peu similaire : définir une classe qui contient les paramètres mais pas la méthode à exécuter, et utiliser la surcharge du constructeur de Thread qui prend en paramètre un ParameterizedThreadStart :

      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
      class Params
      {
          pubilc int Start { get; set; }
          public int End { get; set; }
      }
       
      void Run(object o)
      {
          Params prm = (Params)o;
          for(int i = prm.Start; i <= prm.End; i++)
          {
              ...
          }
      }
       
      ...
       
      var prm = new Params { Start = 0, End = 42 };
      new Thread(Run).Start(prm);
    • Et l'approche la plus simple à mon avis : à partir de C# 2, on peut utiliser des méthodes anonymes :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      void Run(int start, int end)
      {
          for(int i = start; i <= end; i++)
          {
              ...
          }
      }
       
      // méthode anonyme "classique" (à partir de C#2)
      new Thread(delegate() { Run(0, 42); }).Start();
       
      // expression lambda (à partir de C#3)
      new Thread(() => Run(0, 42)).Start();

  6. #6
    Membre averti
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Avril 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2011
    Messages : 54
    Par défaut
    Après recherche sur le forum je viens de tomber sur ce post.
    J'ai quelques soucis pour comprendre le passage de parametres via un Thread.
    Voilà comment je procède.

    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
            private void button2_Click(object sender, EventArgs e)
            {
                string var1 = "salut";
                string var2 = "utilisateur";
                Thread msg = new Thread(new ThreadStart(Mon_Message));
                string[] variables = { var1, var2 };
                msg.Start(variables);
     
     
     
            }
     
            private static void Mon_Message(string[] variables)
            {
                string var1 = variables[0];
                string var2 = variables[1];
                MessageBox.Show("Message : " + var1 + " " + var2);
            }
    Et j'ai droit a une erreur :
    Erreur 1 Aucune surcharge pour 'Mon_Message' ne correspond au délégué 'System.Threading.ThreadStart'
    As-tu une idée d'ou ca peut venir ?
    Ma facon d'aborder la chose n'est pas correcte ?
    Si j'ai bien compris le Thread ne peut accepter qu'un seul parametre, c'est pourquoi j'ai mis mes 2 variables dans un string[].

    Merci d'avance

  7. #7
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par xYz-Falcon Voir le message
    Et j'ai droit a une erreur : Erreur 1 Aucune surcharge pour 'Mon_Message' ne correspond au délégué 'System.Threading.ThreadStart'
    Et sans le static sur la méthode Mon_Message ?

  8. #8
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Le type de la variable est objet, pas string[]
    En .Net "Object" est un "super objet", pas dans le sens où il est "super méga bien top cool", mais dans le sens où TOUS les autres types de données héritent de lui.
    En conséquence, la valeur peut être tout et n'importe quoi, par contre, la signature de la méthode ne peut pas être changée, le paramètre est "Object" et rien d'autre. Il faut ensuite, dans le code de la méthode, caster le paramètre dans le type réellement passé.

    EDIT : bon j'ai oublié la moitié
    Il existe deux délégué pour démarrer un Thread, le premier est celui que tu utilise : ThreadStart.
    Celui-ci n'accepte aucun paramètre. Voir la documentation.
    Le second est ParameterizedThreadStart, qui lui accepte un paramètre. Voir la documentation.

    Tu dois impérativement utiliser strictement le même prototype que celui du délégué, spécifié dans la documentation.

  9. #9
    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
    Avec une expression lambda ce serait plus simple...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread msg = new Thread(() => Mon_Message(var1, var2));

  10. #10
    Membre averti
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Avril 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2011
    Messages : 54
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Avec une expression lambda ce serait plus simple...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread msg = new Thread(() => Mon_Message(var1, var2));
    @tomlev : Nickel ! Ca fonctionne impeccable. Je ne pensais pas que c'était possible de passer plusieurs parametres directement dans un Thread, du moins c'est ce que j'avais lu partout .... c'est pourtant ce qui est fait ici non ? Quel interet de se "compliquer" la vie avec un object si c'est faisable aussi facilement ?

    @ctxnop : Merci pour les explications, et pour le fou rire devant l'ordi en lisant ton "super méga bien top cool".

    @Nathanael : Merci à toi aussi pour l'idée.

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par xYz-Falcon Voir le message
    @tomlev : Nickel ! Ca fonctionne impeccable. Je ne pensais pas que c'était possible de passer plusieurs parametres directement dans un Thread, du moins c'est ce que j'avais lu partout ....
    Ben, non ce n'est pas possible; ici il n'en passe qu'un : la réference à l'objet.

    c'est pourtant ce qui est fait ici non ?
    Non, il n'en passe qu'un (bis).

    Quel interet de se "compliquer" la vie avec un object si c'est faisable aussi facilement ?
    C'est pourtant ce qu'il fait ici : il crée un objet. Je ne comprends pas ta remarque.

  12. #12
    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 xYz-Falcon Voir le message
    Je ne pensais pas que c'était possible de passer plusieurs parametres directement dans un Thread
    Je ne passe aucun paramètre au thread... J'indique seulement comme point d'entrée du thread une méthode anonyme sans paramètre qui appelle Mon_Message avec 2 paramètres. Nuance

    Citation Envoyé par xYz-Falcon Voir le message
    Quel interet de se "compliquer" la vie avec un object si c'est faisable aussi facilement ?
    Les méthodes anonymes n'ont pas toujours existé en .NET. Elles existent depuis la version 2.0 (sous la forme delegate(paramètres) { corps de la méthode }). Les expressions lambda existent depuis C# 3 (.NET 3.5)

    Citation Envoyé par Bluedeep Voir le message
    Ben, non ce n'est pas possible; ici il n'en passe qu'un : la réference à l'objet.
    Non, je n'en passe aucun... enfin je passe le delegate au thread, mais le delegate ne prend aucun paramètre.

  13. #13
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    j'ai eu le même problème il y a quelque semaine je savais pas qu'on pouvait utiliser des expressions lambda
    moi j'avais utilisé un tableau d'objet plus un invoke comme je faisait passé des composants winforms à l'intérieur.

    je mettrais un petit exemple plus tard si vous voulez

Discussions similaires

  1. Passer des arguments à mon thread avec _beginthreadex
    Par fred61 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/01/2015, 21h23
  2. Passage d'argument à un thread avec _Beginthreadex
    Par likenoother dans le forum MFC
    Réponses: 4
    Dernier message: 13/09/2006, 10h02
  3. [C#] Equivalent Property avec arguments de VB.NET
    Par Antz dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/03/2004, 13h14
  4. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15
  5. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01

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