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

Framework .NET Discussion :

[Thread] Comment doit-on les gérer s'ils sont nombreux ?


Sujet :

Framework .NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 14
    Points : 11
    Points
    11
    Par défaut [Thread] Comment doit-on les gérer s'ils sont nombreux ?
    Bonjour tout le monde,



    J'ai en ce petit moment un petit problème :

    Je crée en ce moment un programme qui analyse des pages web. Pour lancer l'analyse sur un site, j'appelle une méthode qui va se charger de tout et me créer mon fichier de réponse. Mais j'aimerais maintenant que mon programme effectue l'analyse de 100 sites web. Je souhaiterais pour celà utiliser les Threads : lancer par exemple 5 threads en même temps, un par analyse de site web, et dès qu'une analyse est terminée, le thread est relancé avec un nouveau site à analyser, et celà jusqu'à 100.

    Ma question première est : est-ce que celà est possible ?

    Parce qu'en bouclant, je peux créer autant de Threads que je veux, mais ce que je n'arrive pas, c'est de faire "ok, lance 5 threads, et dès qu'un thread a terminé son travail, hop tu relance ."

    Merci d'avance pour vos précieuses réponses

  2. #2
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Tu peux faire un sixième thread qui est chargé de mettre les autres au travail.
    Il boucle sur les 5 thread, et vérifie qu'ils sont bien vivants (IsAlive).
    Quand y'en a un qui ne l'est plus, bah il en relance un
    Et pour éviter de surcharger ton proc, tu colles un petit Sleep(200) entre tes vérifications.

    Je suis clair là ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Ouai j'ai compris, je vais essayer. Je te tiens au courant si ça me va
    Merci pour ta réponse rapide.

    Bon j'ai un peu réussi à faire ce que je voulais a priori en utilisant un thread qui gère les autres.
    Maintenant j'ai une petite question qui va surement faire rire tout le monde : imaginons que je veuille plus 100 mais un chiffre quelquonque. Vu qu'on ne peut pas passer d'arguments à un Thread, est ce que "ça se fait" de définir le nombre de sites à analyser dans une variable public static, qui est elle est toujours lisible depuis mon Thread, ou c'est du gros code de porc ?

    Merci

  4. #4
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2004
    Messages : 2 451
    Points : 6 008
    Points
    6 008
    Par défaut
    Salut .

    Alors 2 choses :

    La premiere : On peut tout a fait passer un argument à un Thread. Une petite recherche google te donnera la méthode à suivre ou encore mieux une recherche dans l'aide du framework. ça c'est pour du 1.1, en dotnet 2.0 il y a le delegué ParameterizedThreadStart

    La deuxieme : A partir du moment ou tu ne fait que lire le nombre de Thread à créer tu peut mettre dans une variable static, ce qu'il absolument éviter c'est de faire des lectures/écritures dessus.
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 103
    Points : 1 546
    Points
    1 546
    Par défaut
    Bon tout ce que tu veux faire est possible, meme avec 100 threads, tant que t'oublie pas de synchroniser les accès aux ressources partagées.

    Maintenant, quand tu écrit tes threads, fait en sortes que ceux si appele un délégué sur le thread principal pour indiquer qu'il vienne de finir, ou mieux, grace à tous les mécanisme de synchronisation qu'il existe, fait en sorte que ton thread principal attende gentillement qu'un des threads meurt. Quand il meurt, il le relance avec un nouveau site. Pour cela tu n'a meme pas besoin de commencer avec des parametres si tu utilise une pile ou file contenant les addresses, avec un lock (ou utiliser explicitement un mutex) pour synchroniser l'accès à cette pile. Ainsi chaque thread prend la premier élément de la pile, et s'occupe du site qu'il vient de recevoir.

    Tu meme faire différemment. Plutot que de faire mourrir un thread et de le relancer, fait donc une boucle dans le corps du thread pour qu'il scan cette liste. Si ya pu rien à prendre, il s'arrete. Ensuite ton thread prncipal fait un Join sur chaque thread et dès qu'ils sont tous finis, il se reveille et clos proprement.

    Si tu as des problèmes avec les threads tu peux directement me contacter par MP.
    Mais bon pour 100 sites, et si tu fait tourner ca sur une bonne machine, 20 threads c'est bon.
    tu pourrais meme aller jusqu'a oser mettre les 100, mais bon... là par contre...
    en théorie c'est pas cencer ramer ni prendre trop de CPU, mais après cela dépend de l'implantation du corps de tes threads.

  6. #6
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Suisse

    Informations forums :
    Inscription : mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par dev01
    Une petite recherche google te donnera la méthode à suivre ou encore mieux une recherche dans l'aide du framework. ça c'est pour du 1.1,
    et sans aller si loin
    Comment passer un ou plusieurs paramètres à un thread ? Merci abelman et Morpheus
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Alors au final j'ai fait comme çà :

    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
     
     public void threadLauncher()
            {
                Thread t = new Thread(new ParameterizedThreadStart(ExecuteThread));
                Thread t1 = new Thread(new ParameterizedThreadStart(ExecuteThread));
                Thread t2 = new Thread(new ParameterizedThreadStart(ExecuteThread));
                Thread t3 = new Thread(new ParameterizedThreadStart(ExecuteThread));
                int count = 0;
                while(count!= nUpDownNumber.Value)
                {
                    if (!t.IsAlive && count != nUpDownNumber.Value)
                    {
                        t = new Thread(new ParameterizedThreadStart(ExecuteThread));
                        t.Start(list[count]);
                        count++;
                    }
     
                    Thread.Sleep(200);
                    if (!t1.IsAlive && count != nUpDownNumber.Value)
                    {
                        t1 = new Thread(new ParameterizedThreadStart(ExecuteThread));
                        t1.Start(list[count]);
                        count++;
     
                    }
                    Thread.Sleep(200);
                    if (!t2.IsAlive && count != 100)
                    {
                        t2 = new Thread(new ParameterizedThreadStart(ExecuteThread));
                        t2.Start(list[count]);
                        count++;
                    }
                    Thread.Sleep(200);
                    if (!t3.IsAlive && count != 100)
                    {
                        t3 = new Thread(new ParameterizedThreadStart(ExecuteThread));
                        t3.Start(list[count]);
                        count++;
                    }
                    Thread.Sleep(200);
     
                }
                Thread.CurrentThread.Abort();
     
            }
    Evidemment ThreadLaucher() est lancé dans un thread. Ca marche pas mal du tout mon petit truc, mais vous trouvez ça dégueulasse ?

    Sinon ma méthode ExecuteThread() lance l'analyse de la page web en créant une instance d'un objet, puis en appelant diverses méthodes qui vont alimenter un hashtable pour les informations sur chaque site, et génere un fichier HTML à partir de ce hastable.

    Bon le truc c'est que maintenant, je voudrai générer un fichier html qui contiendra en fait des statistiques génerées à partir de chacune des analyses: imaginons que mon programme detecte si il y a des META sur chaque site, je voudrai pouvoir generer une page HTML a la fin de l'analyse qui me dit : 60 /100 sites analysés on des metas.

    Je pourrais évidemment mettre un hashtable static global alimenté par mes différents threads mais c'est pas bien du tout, n'est ce pas ?

    Alors je si quelqu'un a un excellent lien ou une explication simple de comment partager des variables entre différent threads, je suis preneur.

    Merci pour vos réponses, et merci pour le ParameterizedThreadStart

  8. #8
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Un solution ton pb de partage de données :
    - Tu créé un tableau static de valeurs en parallèle de ton tableau de Thread (même taille).
    - A la fin de son traitement, chaque Thread écrit dans SA case du tableau les stats de son traitement.
    - Ton ThreadLauncher, quand il voit un thread mort, il récupère les stats et il relance un nouveau thread.

    Comme ça tu n'as pas de pb d'écriture concurrente sur un même segment de donnée

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 103
    Points : 1 546
    Points
    1 546
    Par défaut
    Tu instancie tes threads dans un code static ou normal ?

    Si tes threads sont instancés dans une instance de classe A, les threads étant de vulgaire fonctions de l'instance A, ceux ci peuvent utiliser tous les membres de l'instance A.

    Pourquoi voulez vous toujours jouer avec des static ? quelle sale manie.
    Générallement si on utilise un thread par instance c'est justement parce que le thread en question peut accèder aux membres. Et s'il faut synchroniser les membres publiques de la classe, c'est parce que le thread principal peut vouloir y accèder en meme temps que le thread interne.

    Mais dans la mesure ou tous les threads concurrents, sont lancé par la MEME instance, les threads partagent tous les memes ressources, et donc, les static deviennent inutiles.

Discussions similaires

  1. [Scrum] comment doit on faire les spécifications et autres questions
    Par loic_midy dans le forum Méthodes Agiles
    Réponses: 6
    Dernier message: 18/01/2009, 18h56
  2. [ContextMenu] Comment mon style peut gérer les sous-menus ?
    Par Gregory.M dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 18/09/2008, 23h52
  3. Réponses: 7
    Dernier message: 22/03/2008, 03h32
  4. Réponses: 1
    Dernier message: 11/04/2007, 17h11
  5. [Threads]Comment les organiser pour un jeu du serpent ?
    Par Pill_S dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 11/05/2004, 16h22

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