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 et passage de parametre


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Thread et passage de parametre
    Bonjour

    Je suis un peu novice en matiere de MultiThread

    La plupart des exemples que je trouve se contentent de montrer une application simplissime pour une methode void sans parametres affichant un bete hello world

    Dans le cas qui me preoccupe je voudrais executer une methode methode devant me retourner une liste de string et qui demande plusieurs parametre Cette methode effectue un download qui cree plusieurs fichiers et doit evidemment me prevenir quand elle a fini !

    Avez-vous un lien ou un tutoriel me permettant de mieux appréhender la maniere d'abborder le sujet !

    Merci de votre aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194

  3. #3
    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
    Si tu es en 4.0, le plus simple est d'utiliser l'API Task :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Task.StartNew(x => LaMethodeQuiRenvoieUneListe())
          .ContinueWith(t => FaireQuelqueChoseAvecLaListe(t.Result));

  4. #4
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci TomLev

    Non, je suis encore en 3.5

    Merci BenoitM
    C'est vrai j'avais pensé au BackroundWorker

    Mais ca me semblait plus "bricolage" et sans etre certain que ca réponde au besoin
    J'avais donc a priori négligé cette possibilité

    Je vais y jeter un oeil.

    D'autres avis ?

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    Voici un petit exemple :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
        using System;
        using System.Threading;
        // En .Net 1.x
        namespace Threads
        {
        public class MonThread
        {
        int i = 0;
        public MonThread(int i)
        {
        this.i = i;
        }
        public void ThreadFonction()
        {
        for(; i<=30; i++)
        {
        Console.WriteLine(i.ToString());
        Thread.Sleep(300);
        }
        }
        }
        public class Exemple
        {
        public static void Main()
        {
        MonThread mt1 = new MonThread(5);
        Thread t1 = new Thread(new ThreadStart(mt1.ThreadFonction));
        t1.Start();
        MonThread mt2 = new MonThread(10);
        Thread t2 = new Thread(new ThreadStart(mt2.ThreadFonction));
        t2.Start();
        }
        }
        }
        // En .Net 2
        // Il suffit d'utiliser ParameterizedThreadStart
        using System;
        using System.Threading;
        public class Exemple
        {
        public static void Main()
        {
        Exemple e = new Exemple();
        }
        private Thread t;
        public Exemple()
        {
        t = new Thread(new ParameterizedThreadStart(IncrementToTen));
        t.Start(1);// Le parametre est passé dans la méthode Start()
        }
        public void IncrementToTen(object temp)
        {
        int i = (int)temp;
        while(i < 10) i++;
        Console.WriteLine(i.ToString());
        }
        }

    Edit : En effet, désolé, je n'avais pas fait attention au site en question .. x)

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Aeronia

    Bon mais si je comprends bien, la solution c'est de passer par une classe qui va servir de contenant aux proprietés nécessaire a la methode !

    C'est un peu ce que j'etais en train de conclure egalement...

    D'autres confirmations ou remarques a ce sujet ?

  7. #7
    Membre chevronné
    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
    Par défaut
    Bonjour,
    Citation Envoyé par olibara Voir le message
    Mais ca me semblait plus "bricolage" et sans etre certain que ca réponde au besoin
    J'avais donc a priori négligé cette possibilité
    Pour le coup le BackgroundWorker n'est pas du bricolage, Il a été conçus dans un but, pourvoir transmettre des événements de progression du Thread, ces événements ne générent pas de "cross-thread exception", ce qui permet de brancher directement l'IHM dessus.

    Citation Envoyé par olibara
    Bon mais si je comprends bien, la solution c'est de passer par une classe qui va servir de contenant aux propriétés nécessaire a la methode !
    Dans le cadre d'un BackgroundWorker, tu ne peux effectivement passé qu'un argument. Et donc tu es obligé de créer une classe ou une structure regroupant tes divers paramètres.

    Citation Envoyé par olibara
    D'autres confirmations ou remarques a ce sujet ?
    Oui, le plus difficile avec le multi-thread c'est la synchronisation. Plusieurs threads ne devraient pas lire et écrire sur la même variable en même temps (Il y a des objets de synchronisation pour ça).
    Sinon il faut éventuellement prévoir un moyen propre d'annuler le thread.
    Attendre correctement la fin du thread, etc...

  8. #8
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci a tous

    Bon et bien me voila en chemin, je vais commencer par uncapsuler la methoe en question dans une nouvelle classe pour la cause

  9. #9
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par antoine.debyser Voir le message
    Plusieurs threads ne devraient pas lire et écrire sur la même variable en même temps (Il y a des objets de synchronisation pour ça).
    Attention, cette remarque est essentiellement fausse. Deux threads peuvent très bien lire et écrire simultanément dans une même variable dans certains cas (1). Et, réciproquement, le fait que deux threads ne puissent pas lire et écrire dans une même variable à la fois ne garantit pas pour autant qu'il n'y ait pas de problème (2).

    Il faut davantage approcher les problèmes de synchronisation comme l'on approche les transactions sur une base de données : ce qui compte c'est que toute modification de l'état soit consistante et que deux modifications simultanées ne puissent pas se corrompre l'une et l'autre. Le "C" et le "I" de ACID.


    Exemple 1 : L'explorateur de fichiers effectue une série de copie de fichiers sur un thread. Son UI est mise à jour une fois par seconde et affiche le dernier fichier traité. Le thread de fond peut très bien assigner "lastFile" et le thread UI lire "lastFile" sans qu'une synchronisation soit nécessaire.

    Exemple 2 : Une structure de données (liste par exemple) basée sur un tableau "items" d'une part et "count" d'autre part. Si l'on veut ajouter un élément il ne suffit pas de verrouiller d'abord "items", d'ajouter l'élément à i=2, relâcher le verrou puis verrouiller "count" pour le mettre à 3. En effet, entre la fin du premier verrou et le début du second, un thread aurait pu retirer l'élément à "i=1" (l'ancienne queue de la liste) et mettre "count" à 2. On se retrouverait alors avec "count" à 3 et "items" contenant "A, null, C".

    La solution ici est d'avoir un seul verrou commun pour tous les états ("count" et "items") ou un système de verrous hiérarchisés (verrouiller items, verrouiller count, relâcher count, relâcher items) avec un priorité bien établie pour éviter les deadlocks.

Discussions similaires

  1. Thread / Passage de parametres
    Par Tlams dans le forum Général Python
    Réponses: 3
    Dernier message: 04/09/2013, 11h15
  2. [THREAD][AFX]Passage de parametre
    Par Kin0u dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 09/09/2009, 11h48
  3. Réponses: 4
    Dernier message: 04/09/2007, 13h13
  4. Passage de parametre calculé
    Par soazig dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 06/06/2003, 16h25
  5. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59

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