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 :

[Threading] Thread et Timers


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut [Threading] Thread et Timers
    Salut !

    J'ai quelques petits soucis en matières de threading

    Je vois très bien le principe (enfin je crois :] ), j'arrive sans soucis à créer des thread. Mais je me trouve maintenant à un soucis lorsque que je souhaite associer un Thread à un Timer...

    En gros, j'ai une suite de tâche récurrentes à lancer, chacune sur différents intervalles de temps, différents délai de départ, ...

    Je pensais lancer pour chaque tâche un Thread, dans lequel je déclencherai un Timer (Systems.Timers.Timer). J'aimerai ensuite laisser tourner mon service tant qu'au moins une des tâches est active.

    Voila ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    foreach (Worker worker in m_config.Workers)
    {
        Thread thread = new Thread(new ThreadStart(worker.Run));
        m_threads.Add(thread);
        thread.Start();
    }
    while (IsAlive)
    {
        Thread.Sleep(1000);
    }
    Avec la propriété IsAlive tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public bool IsAlive
    {
        get
        {
            bool alive = true;
            foreach (Worker worker in m_config.Workers)
                alive &= worker.IsAlive;
            return alive;
        }
    }
    Là déjà je ne suis pas sur de faire quelque chose de correct et sûr?

    Ensuite, pour la méthode Worker.Run():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    internal void Run()
    {
        m_timer = new System.Timers.Timer(m_waitMinutes * 60000);
        m_timer.Enabled = true;
        m_timer.Elapsed += new System.Timers.ElapsedEventHandler(RunInternal);
        m_timer.Start();
    }
    Le soucis c'est mon thread lance la méthode Worker.Run(), mais semble ne plus être actif après avoir lancer le Timer? Le Timer serait-il levait dans un autre Thread (m_timer.Elapsed étant levé dans un autre ThreadPool d'après MSDN) ?

    Du coup comment garder un contrôle sur le process de mon Worker?
    Et bien sur, je souhaiterai pouvoir tuer à tout moment chacun des Worker en cours, j'ai donc fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    internal void Stop()
    {
        if (m_timer != null)
        {
            m_timer.Stop();
            m_timer.Close();
            m_timer.Dispose();
        }
    }
    Si quelqu'un maitrisant mieux le sujet sur les Threads que moi pouvait me donner un coup de pouce, ce serai trèèès appréciable

    Merci !

  2. #2
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    déjà ça me semble bizarre de lancer un timer dans un thread... qu'est-ce que tu cherches à faire exactement ? à quoi il sert ce timer ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut
    Le soucis c'est mon thread lance la méthode Worker.Run(), mais semble ne plus être actif après avoir lancer le Timer?
    C'est normal, dès que tu sors de la fonction Run le thread s'arrête.

    Tu n'as pas besoin de lancer de thread pour tâche que tu veux exécuter. Tu lances simplement les Timers, chaque Timer s'exécute dans un thread différent.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut
    En gros ce que je veux faire, c'est lancer des taches récurrentes (toutes les heures, 30min, ...). Chacune et indépendante, et possède sa propre logique.

    Par exemple certaine vont vérifier des informations dans une base de données et envoyé des emails. Une autre fera simplement une mise a jour de la base de données, ... (je pourrais donner d'autre exemple, mais ce n'est pas le but )

    J'utilise donc un Timer pour chaque tache. Mais comme toutes mes taches son indépendante, je veux les lancer chacune dans leurs coin. D'où les Threads, mais en effet ils sont peut superflue?

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Les threads ne servent à rien pour faire ça, les timers suffisent.
    Attention d'utiliser le bon type de timer par contre... celui de Windows Forms n'est clairement pas adapté, car il lève les évènements Tick sur le thread de l'interface graphique. Il vaut mieux utiliser System.Timers.Timer ou System.Threading.Timer (je sais plus trop quelle est la différence...)

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut
    Comparing the Timer Classes in the .NET Framework Class Library

    http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

  7. #7
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par matdur Voir le message
    Comparing the Timer Classes in the .NET Framework Class Library

    http://msdn.microsoft.com/en-us/magazine/cc164015.aspx
    ah oui, je me rappelais avoir vu cet article, mais je le retrouvais pas... je bookmarke, ça peut re servir

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut
    Merci pour toutes ces infos, je suis en effet parties sur des Threads alors que c'est inutile dans mon cas... Les timers font tout bien comme il faut!

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

Discussions similaires

  1. heritage de la classe System.Threading.Thread
    Par Minoucha2006 dans le forum C#
    Réponses: 5
    Dernier message: 08/05/2008, 12h59
  2. [Thread ] Thread bloqué
    Par lykim1982 dans le forum Visual C++
    Réponses: 1
    Dernier message: 07/06/2007, 16h38
  3. [Thread]thread principal et autres thread.
    Par david06600 dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 19/12/2006, 15h59
  4. Réponses: 2
    Dernier message: 10/11/2006, 23h08
  5. [Thread] Thread vs while(true)
    Par plutonium719 dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 20/09/2006, 10h30

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