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 :

[Débutant] CCM Le Timer


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 192
    Par défaut [Débutant] CCM Le Timer
    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
            static void Main(string[] args)
            {
                FILE_IO start = new FILE_IO();
                start.CreateCFG();
                start.ReadCFG();
                Var_Check.affect_Tabs();
                Var_Check.check_Vars();
                Console.WriteLine("Time Set for sleep : {0}:{1}:{2}",Var_Check.TimeTab_Unformated[0],Var_Check.TimeTab_Unformated[1],Var_Check.TimeTab_Unformated[2]);
                Timer interval_counter = new Timer();
                while (i != 0)
                {
                    interval_counter.Elapsed += new ElapsedEventHandler(OnTimedEvent);
                    interval_counter.Interval = 60000;
                    interval_counter.Enabled = true;
                }
                System.Diagnostics.Process.Start("hibernate", "\\h");
     
                Console.Read();
            }
            private static int OnTimedEvent()
            {
                i = DateTime.Compare(t1, t2);
                return i;
            }
    Salut encore, j'essaie de réaliser mon premier mini projet. un programme qui met le PC en sleep mode dans un temps écrit dans un fichier
    (histoire d'utiliser un peu toutes les leçons apprises)
    Mon probleme est le Timer, Qui me dit qu'aucune surcharge ne correspond au délégué.
    alors que meme chez MSDN c'est ecrit comme ca
    http://msdn.microsoft.com/fr-fr/libr...al(VS.80).aspx

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    erreur de débutant

    retourne dans l'exemple, tu y notera que la signature de la fonction OnTimedEvent est differente de ce que tu as ecris.

    Toi tu ne lui met aucun parametre en argument, alors que tu aurai du mettre comme dans l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OnTimedEvent(object source, ElapsedEventArgs e)
    sache que tout evenement dit, event Handler, et tout Event Handler veut dire que forcement la fonction appellée par un evenement aura besoin de parametres (generalement (object, EventArg) )

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 192
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    erreur de débutant
    j'avais prévenu !
    Résolu et merci

    edit, sa ce compile, mais ne marche pas.
    l'intervalle n'est point appliqué et le programme se lance dans une boucle infernale qui tue le processeur !
    si vous pourriez me donner une idée..

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    oula lol !

    oui en effet je n'avais pas regardé ton while

    Si c'est une boucle folle, c'est que i reste different de 0, et ca boucle, et boucle encore et encore, avec rien dans la boucle pour laisser "un peu de proc au reste"....

    Bref
    1) surveille i à coup de debugger
    2) le contenu de ta boucle n'a pas de sens :

    à chaque tour de boucle, tu demande à abonner ta callback OnTimedEvent à l'evenement Elapsed.

    Concretement , ca veut dire que apres le premier tour de bouche, si Elapsed est déclenché, alors OnTimedEvent sera appelé une fois.
    Apres le 2eme tour de boucle, si Elapsed est déclenché, alors OnTimedEvent sera appelé deux fois.
    etc etc...

    pourquoi un while d'ailleur?
    si tu le vire ca ira mieux

    Ps : dsl , vais me coucher, ca a beau etre les vacances :p

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 192
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    erreur de débutant

    retourne dans l'exemple, tu y notera que la signature de la fonction OnTimedEvent est differente de ce que tu as ecris.

    Toi tu ne lui met aucun parametre en argument, alors que tu aurai du mettre comme dans l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OnTimedEvent(object source, ElapsedEventArgs e)
    sache que tout evenement dit, event Handler, et tout Event Handler veut dire que forcement la fonction appellée par un evenement aura besoin de parametres (generalement (object, EventArg) )
    le while , c'est tous ce que j'ai trouvé pour
    : '' attendre jusqu'à ce que l'heure dans ma variable soit egale a l'heure locale qq"

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Je me demandes comment tu es arrivé au code que tu as écris en te basant sur le code exemple de la page MSDN que tu donnes.

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    okkkkk.

    Bon , va sur MSDN, chapitre evenement puis lis avant de passer à la pratique, tu as de toute evidence mis la charue avant les boeufs .

  8. #8
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut,
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                while (i != 0)
                {
                    interval_counter.Elapsed += new ElapsedEventHandler(OnTimedEvent);
                    interval_counter.Interval = 60000;
                    interval_counter.Enabled = true;
                }

    Plusieurs remarques :
    - où est déclaré "i" ?
    - où est initialisé "i" ?
    - où tu chope et initialise t1 et t2 ?
    - aucune chance que t1 et t2 soient parfaitement identique dans un cas réel, donc i ne vaudra jamais 0, et donc tu va boucler
    - A chaque itération tu ré-enregistre le délégué (au premier passage de boucle il sera appelé 1 fois, au second 2 fois, au troisième 3 fois, et ainsi de suite, pas étonnant que tu tue le processeur.
    - A chaque itération, tu redéfinit et réactive le timer.
    - Le but des timer est justement de ne pas faire de l'attente active (exactement ce que tu fais en faisant une boucle)

    (Certaines de ces remarques ont été faites par giova_fr, je les appuie donc)

    Ton but c'est de créer un timer, l'initialiser, le démarrer, puis rien foutre jusqu'a ce que le timer émette un tick, ce qui aura lieux à la fin toutes les Interval millisecondes.

    Donc :
    Code csharp : 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
     
    public static void Main()
    {
        Time tm = new Timer();
        tm.Interval = Value; // Valeur lue depuis le fichier et convertie en type int.
        tm.Elapsed += OnTimerEvent;
        tm.AutoReset = false; // L'évènement ne sera déclenchée qu'une fois, après le timer s'arrête, sauf si tu le relances.
        tm.Enabled = true;
     
        /*
         * Il reste un problème ici, c'est que juste après cette instruction ton
         * programme se termine, je te laisse trouver comment éviter ca, un
         * exemple se trouve justement dans la page MSDN que tu as cité.
         */
    }
     
    private void OnTimerEvent(object sender, ElapsedEventArgs args)
    {
        /*
         * Ici tu places le code que tu veux exécuter au bout du temps Value.
         * Et tu place aussi un moyen d'indiquer a ton application que c'est bon
         * elle peux se fermer.
         */
    }

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 192
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    Salut,
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                while (i != 0)
                {
                    interval_counter.Elapsed += new ElapsedEventHandler(OnTimedEvent);
                    interval_counter.Interval = 60000;
                    interval_counter.Enabled = true;
                }

    Plusieurs remarques :
    - où est déclaré "i" ?
    - où est initialisé "i" ?
    - où tu chope et initialise t1 et t2 ?
    - aucune chance que t1 et t2 soient parfaitement identique dans un cas réel, donc i ne vaudra jamais 0, et donc tu va boucler
    - A chaque itération tu ré-enregistre le délégué (au premier passage de boucle il sera appelé 1 fois, au second 2 fois, au troisième 3 fois, et ainsi de suite, pas étonnant que tu tue le processeur.
    - A chaque itération, tu redéfinit et réactive le timer.
    - Le but des timer est justement de ne pas faire de l'attente active (exactement ce que tu fais en faisant une boucle)

    (Certaines de ces remarques ont été faites par giova_fr, je les appuie donc)

    Ton but c'est de créer un timer, l'initialiser, le démarrer, puis rien foutre jusqu'a ce que le timer émette un tick, ce qui aura lieux à la fin toutes les Interval millisecondes.

    Donc :
    Code csharp : 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
     
    public static void Main()
    {
        Time tm = new Timer();
        tm.Interval = Value; // Valeur lue depuis le fichier et convertie en type int.
        tm.Elapsed += OnTimerEvent;
        tm.AutoReset = false; // L'évènement ne sera déclenchée qu'une fois, après le timer s'arrête, sauf si tu le relances.
        tm.Enabled = true;
     
        /*
         * Il reste un problème ici, c'est que juste après cette instruction ton
         * programme se termine, je te laisse trouver comment éviter ca, un
         * exemple se trouve justement dans la page MSDN que tu as cité.
         */
    }
     
    private void OnTimerEvent(object sender, ElapsedEventArgs args)
    {
        /*
         * Ici tu places le code que tu veux exécuter au bout du temps Value.
         * Et tu place aussi un moyen d'indiquer a ton application que c'est bon
         * elle peux se fermer.
         */
    }
    Bon pensons un peu plus, je ne crois pas que ton code soit adapté a mon cas.

    Ce que tu me décrit ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      tm.Interval = Value; // Valeur lue depuis le fichier et convertie en type int.
    La Valeur présente dans le fichier n'est pas une intervalle, mais l'heure a laquelle l'ordi devra se mettre en veille sous cette forme.
    16:00:00
    Donc je crois que ce dont on a besoin est un compteur et non pas une intervalle car elle devra changer selon le temps restant :: DateTime.Now - ""Interval"", ce qui serait encore une fois stressant pour le pc.

    tous ca est trés confus, en plus VS me dit qu'il y'a deux timers ???

    Voila tout le code si vous voulez : http://code.google.com/p/sleeptime/s...wse/#svn/trunk

    PS: si vous trouver d'autre optimisation a faire je suis tres preneur

  10. #10
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Aucune importance que tu stock une heure ou un intervalle, le timer c'est un intervalle et puis c'est tout.
    Tu stock une Heure ? Et bien ton intervalle sera (Heure_dans_le_fichier - Heure_qu_il_est_maintenant), le tout converti en milliseconde.
    Le calcul ne se fait qu'une fois et tu obtiendra bien un évènement lancé à l'heure voulue.
    Si j'ai le temps je regarderai a ton code complet dans l'aprem mais je te promet rien.

    Edit :
    Aller j'ajoute tout de même un code pour illustrer et simplifier :
    Code csharp : 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
     
    public static void Main()
    {
    	string filepath = @"C:\Sleeper\config.cfg";
    	DateTime _TimeToSleep = null;
    	using (StreamReader sr = new StreamReader(filepath))
    	{
    		string content = sr.ReadToEnd();
    		DateTime.TryParse(content, out _TimeToSleep); // Ici tu peux ajouter un autre paramètre qui permet de définir ton format de date (yyyymmjj, jj/mm/yyyy, ....), ca concerne également les heures.
    	}
    	if (_TimeToSleep == null)
    	{
    		Console.WriteLine("Mauvais format de date dans le fichier de config");
    		return;
    	}
     
    	TimeSpan _Interval = _TimeToSleep.Subtract(DateTime.Now);
    	System.Timers.Timer tm = new System.Timers.Timer();
    	tm.AutoReset = false;
    	tm.Interval = _Interval.TotalMilliseconds;
    	tm.Elapsed += tm_Elapsed;
    	tm.Enabled = true;
     
    	// Faire quelque chose ici pour ne pas quitter l'application
    }
     
    static void tm_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
    	System.Diagnostics.Process.Start("hibernate", "\\h");
    }

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 192
    Par défaut
    merci beaucoup !

Discussions similaires

  1. [débutant] [VB.NET] Timer + label + checkbox ...
    Par Amenos dans le forum Windows Forms
    Réponses: 14
    Dernier message: 27/03/2006, 13h26
  2. [C#][service windows] problème de débutant avec 1 timer
    Par Nycos62 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 14/10/2005, 11h22
  3. Réponses: 7
    Dernier message: 23/08/2005, 15h56
  4. [Débutant]Problème avec les timers
    Par mickael777 dans le forum MFC
    Réponses: 1
    Dernier message: 11/04/2005, 11h00
  5. [débutant] Timer inférieur à 1ms ? Timer + précis ?
    Par hepar dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/02/2004, 18h42

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