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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 36
    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 : 39
    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 ?

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