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 :

Lancer des threads par un nom ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut Lancer des threads par un nom ?
    Bonjour,

    après plusieurs lecture (FAQ et autres) sur les threads, je n'arrive pas à trouver une solution à ce problème:

    Je souhaite faire du traitement sur les journaux d'évènements de Windows.
    Pour cela j'ai un programme qui:
    • Charge un ensemble de règle
    • Appelle la fonction de traitement avec un journal (parmis ceux disponibles) et les règles correspondantes au journal


    Actuellement, si les règles concerne 5 journaux (System, Application, Security, ....) j'appelle 5 fois ma fonction de traitement.
    Au final le temps de traitement est l'addition de tous les temps de traitement.

    Mon idée est de lancer un thread de traitement/journal afin que le temps de traitement soit égal au sous temps de traitement le plus long.

    Cependant, je ne connait pas le nombre de jounaux concernés dans les règles défini par l'utilisateur. Je ne peut donc pas prévoir combien d'objet thread je doit créé.

    J'ai essayé dans une boucle (de 0 au nombre de journaux devant être traités) de lancer un thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    foreach (String eventLog in eventLogNames)
    {
    // récupération de l'ensemble de règles dans un ArrayList
    rulesList = configurationFile.getRulesList(eventLog);
    Création de mon objet "tf" (utilisant la directive using System.Threading;)
    ThreadFilter tf = new ThreadFilter(eventLog, syslog, rulesList, debug, lastExecTime, maxExecTime);
    // création du thread
    Thread t = new Thread(tf.ThreadLoop);
    //lancement
    t.Start();
    }
    Mon problème est le suivant:
    à chaque pas du foreach, eventLog récupère une nouvelle valeur.
    Cependant, en déboguant (ecriture dans un fichier texte dans le thread), je vais avoir trois fois la même string eventLog (au lieu de trois valeur différentes).

    Comment puis-je lancer X threads en même temps en dissociant les ressources.

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    En supposant que le nombre de journaux reste raisonnable (une dizaine ...) tu peut tout simplement faire comme ça :
    Code c# : 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
     
    foreach (String eventLog in eventLogNames)
    {
      // récupération de l'ensemble de règles dans un ArrayList
      rulesList = configurationFile.getRulesList(eventLog);
      TraiterListe(rulesList, eventLog);
    }
     
    public void TraiterListe(?? list, ?? log)
    {
      Thread td = new Thread(new ThreadStart(delegate{
         try
         {
             opérations utilisant list et log
         }
         catch(Exception ex)
         {
            sortir l'exception quelque part
         }
      }));
      td.Name = "Un nom cool pour voir dans le debug";
      td.IsBackgroundThread = true; /* éviter d'avoir un thread qui empêche à l'application de se fermer ... au cas où ... */
      td.Start();
    }
    Si tu as des centaines de journaux, tu peut regarder du côté des ThreadPool ... mais l'idée reste la même.

    Sinon dans le Framework 4.0 il y aura un truc sympa nommé Parallel extensions cf. http://vincentlaine.developpez.com/t...s-collections/ et http://vincentlaine.developpez.com/t...el-extensions/

  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
    Citation Envoyé par AkH Voir le message
    Mon idée est de lancer un thread de traitement/journal afin que le temps de traitement soit égal au sous temps de traitement le plus long.
    Euh... tu as 5 processeurs ?
    S'il suffisait de lancer plein de traitements en parallèle pour gagner du temps, ça se saurait... mais il faut que les ressources matérielles suivent (sachant qu'évidemment, ça n'utilise pas seulement le processeur, mais aussi le disque dur, la RAM...). Même si les traitements sont faits en parallèle, ils doivent quand même se partager les ressources matérielles, donc il ne faut pas croire qu'en faisant 5 threads tu va diviser par 5 ton temps de traitement...

    Citation Envoyé par AkH Voir le message
    Mon problème est le suivant:
    à chaque pas du foreach, eventLog récupère une nouvelle valeur.
    Cependant, en déboguant (ecriture dans un fichier texte dans le thread), je vais avoir trois fois la même string eventLog (au lieu de trois valeur différentes).

    Comment puis-je lancer X threads en même temps en dissociant les ressources.
    En utilisant des variables locales (on voit pas tout ton code, mais je soupçonne que les variables que tu manipules sont déclarées comme membres de la classe, et donc partagées entre tes threads...)

  4. #4
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut
    C'est bon j'ai trouvé: vive "ThreadPool.QueueUserWorkItem"

    Cela me convient parfaitement et le temps de traitement est très court (inférieur à 3-4 secondes)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/05/2007, 00h35
  2. lancer des modules par défaut
    Par troumad dans le forum Debian
    Réponses: 2
    Dernier message: 17/12/2006, 21h05
  3. Tuer des processus par leur nom
    Par tedparker dans le forum Access
    Réponses: 2
    Dernier message: 12/09/2006, 16h19
  4. comment récupere des element par le nom de la balise?
    Par MASSAKA dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/08/2005, 19h59

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