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 de traitement d'une journée


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Apprenti Ingénieur Informatique
    Inscrit en
    Octobre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 82
    Points : 84
    Points
    84
    Par défaut Thread de traitement d'une journée
    Bonjour,

    Je lance un thread avec une liste d'horodate dedans de type "ddMMyyyyhhmmss". Et j'aimerais que lorsque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(liste_horodate.contains(DateTime.now.toString( "ddMMyyyyhhmmss")))
         Action();
    Else
         //Ne rien faire
    Et j'aimerais que ça tourne toute la journée pour être sûr de ne pas louper d'action à faire (sachant qu'il y a des fois des trous d'une heure ou alors 4 secondes, cela varie).

    Connaissez vous une méthode propre de coder ça sans écrire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while(true)
    {
    if(liste_horodate.contains(DateTime.now.toString( "ddMMyyyyhhmmss")))
         Action();
    Else
         //Ne rien faire
     
    }

    Merci bien.

    Ben

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Salut,
    tu peux utiliser un System.Windows.Froms.Timer qui sert à ça.



    Le principe :
    une liste qui contient des dates où il faut faire qqe chose. (A ce propos essaye de stocker tes données dans un format adapté; string ne te remontera pas des dates incorrectes par exemple)
    un timer qui contrôle toutes les dates chaque seconde
    pour chaque date qui correspond un traitement parallèle est lancé

    Ci-dessous la classe complète.
    Le code est commenté mais pose des questions si besoin.
    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
    58
    59
    60
    61
    62
    63
    64
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
     
     
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            System.Windows.Forms.Timer m_Timer = new System.Windows.Forms.Timer();
            List<DateTime> m_Horodates = new List<DateTime>();
     
            public Form1(DateTime[] pHoroDates)
            {
                InitializeComponent();
                m_Horodates.AddRange(pHoroDates);
     
     
                m_Timer.Interval = 1000; //intervale de 1 seconde
                m_Timer.Tick += new EventHandler(Traitement); //fonction à appeler
                m_Timer.Start();//lancement du timer;
     
                this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
     
     
            }
     
            void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                m_Timer.Stop();//arrêt du timer lorsqu'on ferme la fenêtre
            }
     
            void Traitement(object sender, EventArgs e) //ce traitement est effectué à chaque tick du timer
            {
                List<DateTime> dates = (from d in m_Horodates
                                      where (d - DateTime.Now) <= TimeSpan.FromSeconds(1)
                                      select d).ToList<DateTime>(); //retourne toutes les dates qui sont égale à la date actuelle à une seconde près (on ignore les ms)
     
                foreach (var date in dates) //on peut avoir 0 ou n date qui correspondent dans la liste
                {//petit conseil; s'il est interdit d'avoir deux fois la même date il faut mieux utiliser un HashSet (http://msdn.microsoft.com/en-us/library/bb353005.aspx)
     
                    //donc pour chaque date qui correspond on lance le traitement dans un thread secondaire
                    //ce qui ne bloque pas le processus de contrôle (date == date actuelle)
                    //ni l'interface etc...
                    var t = new Thread(new ParameterizedThreadStart(Action));
                    t.Start(date);                
                }
            }
     
            void Action(object pDate)
            {
                DateTime date = (DateTime)pDate;
                //todo
     
            }
        }
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Apprenti Ingénieur Informatique
    Inscrit en
    Octobre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 82
    Points : 84
    Points
    84
    Par défaut
    Ok merci beaucoup, je t'assure que c'est super clair et que ça va m'aider.

    Mais par exemple si je te demande un truc vraiment "utile" et simple pour mon application :

    Un programme qui chaque jour me lance un thread "traitement", j'utiliserais le timer également je pense mais de quelle façon ?

  4. #4
    Membre régulier
    Homme Profil pro
    Apprenti Ingénieur Informatique
    Inscrit en
    Octobre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 82
    Points : 84
    Points
    84
    Par défaut
    (Timer, instancié dans une classe et non dans une form)

    Je m'explique : chaque jour je vais lancer un traitement à minuit, et dans ce traitement on doit checker le temps pendant 24h pour voir si un horodate correspond et ainsi lancer un new thread(Action);

    ..

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Un worker (c'est un thread en fait). Il tourne en boucle. Il s'occupe de vérifier s'il faut lancer une action. Si une action doit être lancé, il lance un runner (un autre thread) qui s'occupe de faire l'action.

    C'est le principe que j'ai utilisé dans une application de scheduling. On configurait des tâches à différente heure et le worker les lancait au bon moment.
    Les fautes d'orthographes sus-citées sont déposées auprès de leurs propriétaires respectifs. Aucune responsabilité n'est engagée sur la lisibilité du message ou les éventuels dommages qu'il peut engendrer.

  6. #6
    Membre régulier
    Homme Profil pro
    Apprenti Ingénieur Informatique
    Inscrit en
    Octobre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 82
    Points : 84
    Points
    84
    Par défaut
    Je ne suis pas sûr d'avoir compris ! Tu parles du backgroundworker ?

    Vraiment mon but est de pouvoir lancer un thread qui contient un Timer qui vient regarder par exemple chaque minute s'il est minuit et s'il est minuit -> il lance un autre thread dans lequel un timer vient regarder chaque seconde si l'horodate correspond à un horodate de la liste d'horodate qui à son tour lance un new thread(Action)... De l'aide (juste pour les timer ) ?

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Pas besoin d'un Timer. Si tu veux utiliser un BackgroundWorker, simplement faire la vérification de l'heure en boucle dans sa méthode. Et quand la condition te satisfait tu lances un autre thread, voilà.
    Les fautes d'orthographes sus-citées sont déposées auprès de leurs propriétaires respectifs. Aucune responsabilité n'est engagée sur la lisibilité du message ou les éventuels dommages qu'il peut engendrer.

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Dans l'exemple que je t'ai donné tu n'a pas besoin d'un thread qui lance le timer qui lance un nouveau thread.
    Tu lances directement ton timer et il lance ses threads. Implicitement tu lances ton timer dans un thread (le thread principal) mais un timer n'est pas bloquant. Donc tant que ton thread principal sera en vie ton traitement sera exécuté chaque fois qu'une date correspond.

    Pourquoi veux-tu un thread qui lance un timer qui lance des threads ?

  9. #9
    Membre habitué

    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2009
    Messages : 62
    Points : 157
    Points
    157
    Par défaut
    Une autre approche est d'utiliser la classe Windows TaskScheduler

    Quelques exemples d'applications :
    • Quartz Enterprise Scheduler .NET : Quartz.NET is a full-featured, open source job scheduling system that can be used from smallest apps to large scale enterprise systems. (Je recommande).
    • CodeProject TaskScheduler : Task Scheduler is a class that schedules and automatically fires events at a time you specify. All important triggers are implemented: OnlyOneTime, Daily, Weekly and Monthly.
    • CodePlex Task Scheduler Managed Wrapper : This project provides a single assembly wrapper for the 1.0 and 2.0 versions of Task Scheduler found in all Microsoft operating systems post Windows 98. It simplifies the coding, aggregates the multiple versions, provides an editor and allows for localization support.

Discussions similaires

  1. traitement d'une chaine de caractère
    Par mohamed dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/12/2004, 17h45
  2. Les Threads... J'en remet une couche :)
    Par Higestromm dans le forum C++
    Réponses: 5
    Dernier message: 17/11/2004, 12h19
  3. Réponses: 3
    Dernier message: 21/06/2004, 11h20
  4. [SWING][THREAD]Méthodes pour afficher une Frame
    Par pompidouwa dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 05/05/2004, 10h35
  5. Réponses: 6
    Dernier message: 03/03/2004, 14h31

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