1
votes

Utilisation du chronomètre dans une application console

Je veux créer un simple chronomètre dans la console C #. Lorsque vous appuyez sur la touche S, vous démarrez le chronomètre et la touche Q pour arrêter le chronomètre. Et à la fin, le temps écoulé s'affichera en Heures: Min: Sec. Jusqu'à présent, le chronomètre démarre mais lorsqu'il s'arrête, il n'obtient pas le temps écoulé.

static void Main(string[] args)
{
    Console.WriteLine("The stopwatch, press S to begin and Q to stop");
    var UserInput = Console.ReadLine();
    System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
    stopWatch.Start();

    switch (UserInput)
    {
        case "s":
            stopWatch.Start();;
            break;
        case "q":
            stopWatch.Stop();

            break;
        default:
            Console.WriteLine("You did something wrong");
            break;
    }

    // Get the elapsed time as a TimeSpan value.
    TimeSpan ts = stopWatch.Elapsed;

    // Format and display the TimeSpan value. 
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 2);
    Console.WriteLine("RunTime " + elapsedTime);

    Console.ReadLine();
}

Voici le résultat:

https://i.stack.imgur.com/VKtCQ.png


15 commentaires

Quelle est votre production exactement?


Pourquoi votre chronomètre démarre-t-il avant de manipuler la touche enfoncée?


Tapez-vous «Q» pour arrêter ou «q»?


Il n'y a rien de mal avec la classe Chronomètre. Pourquoi dites-vous que cela ne fonctionne pas? Qu'avez-vous fait, à quoi vous attendiez-vous et que s'est-il passé? Il y a probablement un autre problème impliqué


Chronomètre est très simple. Il ne «exécute» rien. Il stocke la valeur du compteur de ticks haute performance lorsqu'il démarre. Lorsque vous appelez Stop , il récupère la valeur actuelle du compteur et la compare à l'original pour calculer Elapsed . Lorsque vous appelez Elapsed alors qu'il est toujours en cours d'exécution, il compare la valeur de compteur actuelle à celle d'origine. Si vous obtenez une valeur inattendue, cela signifie probablement qu'il y a un problème dans le code.


Vous devez également boucler l'application pendant que le chronomètre est en cours d'exécution et afficher uniquement le temps écoulé après avoir appuyé sur q


@marsze non, il se comporte différemment selon qu'il est "en cours d'exécution" ou non


@marsze ce n'est pas ce que montre la source.


@marsze ce n'est pas du tout ce que fait la source. elapsed est la valeur stockée. C'est la valeur de retour par défaut, définie par `Stop (). Pas l'actuel. SEULEMENT s'il est en cours d'exécution, celui en cours est retourné, sans rien mettre à jour. La valeur actuelle est renvoyée uniquement si le chronomètre est "en cours d'exécution"


@PanagiotisKanavos Non écoulé est augmenté mais timeElapsed . Quoi qu'il en soit, je pense que nous savons tous les deux comment cela fonctionne, mais ne nous comprenons pas. En un mot: Elapsed (la propriété) renvoie le temps écoulé actuel lors de l'exécution, et reste constant à l'arrêt. C'est ce que tu voulais dire aussi, non?


@Eldy J'ai mis à jour le message avec une photo.


@ Aars93 je voulais juste voir si ça marche mon mauvais


@kjhf la touche 'q' et non 'Q'


@PanagiotisKanavos vous avez raison, cela fonctionne, mais je voulais que le temps écoulé le montre. C'est vrai que timeElapsed est augmenté et j'ai trouvé bizarre pourquoi il n'écrivait pas dans la console. Et merci d'avoir clarifié.


@marsze Merci: D


3 Réponses :


2
votes

Cela sent les devoirs, mais:

Votre problème majeur n'est pas que votre code ne "fonctionnera" pas, c'est que vous parcourez toute la partie chronomètre du code. Vous n'avez pas de boucle pour récupérer l'entrée de l'utilisateur à plusieurs reprises, donc essentiellement peu importe l'entrée de votre utilisateur en premier lieu. Essayez-le, mettez en veille après votre instruction switch pour une seconde System.Threading.Thread.Sleep (1000) , puis insérez diverses entrées utilisateur.

Je vous recommande de vous pencher sur les boucles do while pour que votre entrée utilisateur soit acceptée à plusieurs reprises. En principe, chaque section de votre code fonctionnerait probablement si vous pouviez comprendre comment faire un cycle d'entrée.

P.S. Je ne vois pas pourquoi vous divisez vos millisecondes par 2. Cela vous causera un mal de tête plus tard.


0 commentaires

3
votes

Il vous manque une boucle. Vous appuyez probablement sur 's' pour démarrer et lorsque vous appuyez sur 'q', vous atteignez la dernière console.ReadLine ()

Si vous ajoutez une boucle, tout fonctionne:

    static void Main(string[] args)
    {
        Console.WriteLine("The stopwatch, press S to begin and Q to stop");
        System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
        stopWatch.Start();

        var done = false;

        while (!done)
        {
            var UserInput = Console.ReadLine();

            switch (UserInput)
            {
                case "s":
                    stopWatch.Start();
                    break;
                case "q":
                    stopWatch.Stop();
                    done = true;
                    break;
                default:
                    Console.WriteLine("You did something wrong");
                    break;
            }
        }

        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value. 
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 2);
        Console.WriteLine("RunTime " + elapsedTime);

        Console.ReadLine();
    }


1 commentaires

merci c'est ce que je cherchais maintenant je peux continuer.



-1
votes

Vous pouvez faire quelque chose comme ceci:

    static void Main(string[] args)
    {
        Console.WriteLine("The stopwatch, press S to begin and Q to stop");
        var UserInput = Console.ReadLine();
        System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
        stopWatch.Start();


    Decide:
        switch (UserInput.ToLower())
        {
            case "s":
                stopWatch.Start();

                while (!Console.KeyAvailable)
                {
                    // Get the elapsed time as a TimeSpan value.
                    TimeSpan ts = stopWatch.Elapsed;
                    Console.Clear();
                    // Format and display the TimeSpan value. 
                    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                        ts.Hours, ts.Minutes, ts.Seconds,
                        ts.Milliseconds / 2);
                    Console.WriteLine("RunTime " + elapsedTime);
                    Thread.Sleep(1000);
                }

                UserInput = Console.ReadLine();
                if (UserInput.ToLower() != "q")
                {
                    goto Decide;
                }
                break;
            case "q":
                stopWatch.Stop();

                break;
            default:
                Console.WriteLine("You did something wrong");
                break;
        }
    }


5 commentaires

Que fait votre code et pourquoi pensez-vous que cela aide l'OP?


l'OP veut arrêter le chronomètre en appuyant sur la touche et cela résout le problème


Est-il vraiment nécessaire d'utiliser goto ?


selon moi, le code semble plus lisible que d'utiliser une autre boucle while


@UweKeim, Nitin Sawant a raison, c'est ce que je veux très simple mais j'ai merdé. Merci Nitin, mais je n'utiliserai pas goto.