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 :

[Console] Réponse utilisateur ou exécution dans quelques secondes


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Par défaut [Console] Réponse utilisateur ou exécution dans quelques secondes
    Salut,

    Situation :
    Je suis en train de créer une application console qui demande à l'utilisateur de confirmer un paramètre. Si l'utilisateur n'a pas répondu dans 5 secondes alors on exécute le code avec la valeur spécifiée.

    Problème :
    Avec le code si dessous je ne sors jamais de ma boucle "while(true)" pour lire la réponse de l'utilisateur.

    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
            static void Main()
            {
                bool reponse = true;
                Console.WriteLine("Oui ou non (o/n) ?");
                Delayed(5000, () => DoAction(reponse));
                while (true)
                {
                    var consoleKey = Console.ReadKey().Key;
     
                    if (consoleKey.Equals(ConsoleKey.O))
                    {
                        reponse = true;
                        break;
                    }
                    else if (consoleKey.Equals(ConsoleKey.N))
                    {
                        reponse = false;
                        break;
                    }
                }
     
                Console.WriteLine();
                DoAction(reponse);
                Console.ReadLine();
            }
     
            public static void DoAction(bool reponse)
            {
                if (reponse) Console.WriteLine("Oui");
                else Console.WriteLine("Non");
            }
     
            private static void Delayed(int delay, Action action)
            {
                Timer timer = new Timer();
                timer.Interval = delay;
                timer.Elapsed += (s, e) =>
                {
                    action();
                    timer.Stop();
                };
                timer.Start();
            }

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    T'as quelques solutions simples à mettre en place ici:

    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
     
            static void Main(string[] args)
            {
                while (true)
                {
                    Console.WriteLine("Oui ou non (o/n) ?");
                    ConsoleKey resp = ReadKeyYesDefault();
                    if (resp == ConsoleKey.O)
                        Console.WriteLine(Environment.NewLine + "Vous avez choisi de mourir");
                    else
                        Console.WriteLine(Environment.NewLine + "Alive");
                }
            }
     
            static ConsoleKey ReadKeyYesDefault()
            {
                var task = Task.Run(() => Console.ReadKey());
                bool read = task.Wait(3000);
                if (read) return task.Result.Key;
                return ConsoleKey.O;
            }

  3. #3
    Membre émérite
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Par défaut
    Citation Envoyé par alavoler Voir le message
    T'as quelques solutions simples à mettre en place ici:
    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
     
            static void Main(string[] args)
            {
                Console.WriteLine("Oui ou non (o/n) ?");
                ConsoleKey resp = ReadKeyYesDefault();
                if (resp == ConsoleKey.O)
                    Console.WriteLine("\nVous avez choisi de mourir");
                Console.ReadKey();
            }
     
            static ConsoleKey ReadKeyYesDefault()
            {
                var task = Task.Run(() => Console.ReadKey());
                bool read = task.Wait(5000);
                if (read) return task.Result.Key;
                return ConsoleKey.O;
            }
    Merci cela à l'air d'être parfait. A mettre en situation maintenant.

    Edit : (C'est bon)

    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
            static void Main()
            {
                Console.WriteLine("Oui ou non (o/n) ?");
                var response = ReadKeyOrDefault();
                Console.WriteLine();
                if (response)
                    Console.WriteLine("Oui");
                else
                    Console.WriteLine("Non");
                Console.ReadLine();
            }
     
            static bool ReadKeyOrDefault()
            {
                var task = Task.Run(() => 
                {
                    while (true)
                    {
                        var consoleKey = Console.ReadKey().Key;
                        if (consoleKey.Equals(ConsoleKey.O))
                            return true;
                        else if (consoleKey.Equals(ConsoleKey.N))
                            return false;
                    }
                });
                bool read = task.Wait(5000);
                if (read)
                    return task.Result;
                else
                    return true;
            }

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    katkiller
    Je t'ai laissé un subtile bug quand même,
    lorsque le ReadKey n'est pas consommé... au prochain ReadKey... il doit l’Être
    En gros si t'attend 5 ReadKey (avec la réponse automatique) et bien il faudra écrire 5 caractères pour déclencher l'action...

    Je sais pas si y a un flush / clear du buffer... j'ai pas trouvé d'astuce, même un write('O') ne suffit pas

  5. #5
    Membre émérite
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Par défaut
    Citation Envoyé par alavoler Voir le message
    katkiller
    Je t'ai laissé un subtile bug quand même,
    lorsque le ReadKey n'est pas consommé... au prochain ReadKey... il doit l’Être
    En gros si t'attend 5 ReadKey (avec la réponse automatique) et bien il faudra écrire 5 caractères pour déclencher l'action...

    Je sais pas si y a un flush / clear du buffer... j'ai pas trouvé d'astuce, même un write('O') ne suffit pas
    Effectivement, bonne remarque
    Je viens de me heurter à ce problème.

    Si quelqu'un a une solution, je suis preneur !

    Pour bien réexpliquer le problème :
    Si j'appelle une deuxième fois ma méthode pour demander à l'utilisateur si je doit continuer et que sur le premier choix l'utilisateur n'a rien sélectionné, il est obligé d'écrire deux fois la lettre pour valider son choix...

    Voici un exemple ou j'appel deux fois la méthode "ReadKeyOrDefault()" et ou je suis obligé d'écrire deux lettre pour que mon deuxième choix soit prit en compte :
    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
    static void Main()
            {
                Console.WriteLine("Oui ou non (o/n) ?");
                var response = ReadKeyOrDefault();
                Console.WriteLine();
                if (response)
                    Console.WriteLine("Oui 1");
                else
                    Console.WriteLine("Non 1");
     
                var response2 = ReadKeyOrDefault();
                Console.WriteLine();
                if (response2)
                    Console.WriteLine("Oui 2");
                else
                    Console.WriteLine("Non 2");
                Console.ReadLine();
            }
     
            static bool ReadKeyOrDefault()
            {
                var task = Task.Run(() => 
                {
                    while (true)
                    {
                        var consoleKey = Console.ReadKey().Key;
                        if (consoleKey.Equals(ConsoleKey.O))
                            return true;
                        else if (consoleKey.Equals(ConsoleKey.N))
                            return false;
                    }
                });
                bool read = task.Wait(5000);
                if (read)
                    return task.Result;
                else
                    return true;
            }
    PS : en plus le projet sur lequel je bosse est en 3.5 j'ai du passer passer par la librairie : TaskParallelLibrary

  6. #6
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Citation Envoyé par alavoler Voir le message
    Je sais pas si y a un flush / clear du buffer... j'ai pas trouvé d'astuce, même un write('O') ne suffit pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (Console.KeyAvailable)
        Console.ReadKey (false);

  7. #7
    Membre émérite
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Par défaut
    Citation Envoyé par Sehnsucht Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (Console.KeyAvailable)
        Console.ReadKey (false);
    Je n'arrive pas a faire fonctionner ta proposition... Peut-être que c'est moi qu'il ne voit pas comment l'utiliser !

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

Discussions similaires

  1. Exécuter une fonction après quelques secondes
    Par Akim13 dans le forum Langage
    Réponses: 13
    Dernier message: 12/03/2013, 17h56
  2. [MooTools] Exécution fonction après quelques secondes
    Par latour500 dans le forum Bibliothèques & Frameworks
    Réponses: 6
    Dernier message: 14/09/2012, 11h48
  3. Réponses: 4
    Dernier message: 16/12/2009, 12h26
  4. [SQL] Bloquer l'enregistrement dans une table pendant quelques secondes
    Par syl2042 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/09/2007, 10h19
  5. attente réponse utilisateur dans un formulaire
    Par Australia dans le forum Access
    Réponses: 11
    Dernier message: 25/01/2006, 15h49

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