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 :

Attendre qu'un événement se soit produit avant de continuer une fonction


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut Attendre qu'un événement se soit produit avant de continuer une fonction
    Bonjour,
    j'aurais besoin de vos lumières !

    J'ai une formulaire avec 2 zones de texte: questionTextBox et answerTextBox
    Quand questionTextBox pose une question à l'utilisateur, je voudrais attendre qu'il tape sa réponse dans answerTextBox et selon sa réponse afficher juste ou faux dans questionTextBox et faire ça plusieurs fois.

    J'ai fait ce code mais ca bloque tout :
    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
            AutoResetEvent waitHandle = new AutoResetEvent(false);
     
            private void buttonStart_Click(object sender, EventArgs e)
            {
                Questions();
            }
     
            public void Questions()
            {
                questionTextBox.Text = "en quelle année est né XXX?"
     
                // Wait for event completion
                waitHandle.WaitOne();
     
                // check answer
                // TBD
                questionTextBox.Text = "OK";
            }
     
            private void answerTextBox_TextChanged(object sender, EventArgs e)
            {
                string answ = answerTextBox.Text.ToString();
                waitHandle.Set();
            }
    Je n'ai pas mis le WaitHandle dans uen fonction mais au global pour être accessible partout. C'est une erreur ?
    Pouvez vous ml'indiquer comment je dois m'y prendre (j'aimerais ensuite récupérer la réponse tapée par l'utilisateur, c'est faisable avec un handler ? j'imagine un pointeur, mais c'est rarement utilisé en C#)

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    ça ressemble assez à un exercice que j'avais eu pendant mes études (apparemment on ne change pas les vieux classiques).
    Mais si c'est bien ça, tu ne décrit pas ton besoin réel, tu décris la manière que tu penses la bonne pour répondre au besoin.

    Si le but est d'avoir un questionnaire où l'utilisateur répond à des questions et que selon les réponses on affiche vrai ou faux et on donne une note à la fin, alors il faut avoir une autre approche.
    1) Changer le premier textbox par un Label (à moins de vouloir permettre à l'interrogé de changer la question)
    2) Utiliser le OnExit plutôt que le OnTextChanged (sinon tu ne sauras pas quand l'interrogé à fini de taper sa réponse), ou alors un bouton de validation (pour éviter qu'il ne tape malencontreusement sur TAB et que ça compte faux alors qu'il n'a pas fini de répondre).
    3) Bien entendu, préparer les questions et différentes réponses possibles à l'avance (ne pas tenir compte de la casse dans les réponses, et admettre plusieurs réponses comme bonnes genre 'St Jean', 'Saint Jean')

    Pour le reste tu devrais pouvoir t'en sortir

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Merci popo, effectivement d'un label et d un onExit sur ma textBox est plus judicieux.
    Sur le WaitHandle, tu veux dire que ce n'est pas la solution ? Quel autre façon d'attendre que la textBox soit complétée est ce que tu suggères ?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    J'ai aussi essayé d'utiliser async et await. Mais j'ai des soucis avec et j'ai l'impression que ce n'est aps la bonne méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            public async void MethodAsync()
            {
                computerQuestionLabel.Text = "en quelle année est né XXX?";
                string answer = await answerTextBox_TextChanged();
                // traiter l'info etc...
            }
     
            private string answerTextBox_OnExit()
            {
                string answ = answerTextBox.Text.ToString();
                return answ;
            }
    Si je fais ca, j'ai une erreur sur la ligne avec le await qui dit que "string does not contain a definition for GetAwaiter".

    -> Que me conseillez vous ?

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ?

    si tu dois attendre que textbox answer textchanged pour faire quelque chose, il faut mettre le code dans cet event, pourquoi vouloir le mettre dans un autre ?

    si tu veux attendre que la réponse entière soit saisie, il faut un bouton pour que l'utilisateur puisse dire qu'il a fini d'écrire
    et là aussi le code va dans le bouton, aucune raison de mettre le code ailleurs

    donc pas besoin de resetevent ou d'async
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    En fait, je voudrais faire plusieurs questions d'affilées. Si je mets tout dans l'event, je vais confondre les réponses.
    C'est pour ca que je voudrais avoir un fonction qui s’interrompt, regarde la réponse, puis continue, s’interrompt, regarde la réponse, etc.

  7. #7
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par droledenm Voir le message
    En fait, je voudrais faire plusieurs questions d'affilées. Si je mets tout dans l'event, je vais confondre les réponses.
    A un instant T, tu as une question. Lorsque l'utilisateur indique sa réponse (en validant via un bouton ou en tapant sur la touche Entrée), tu lui indiques le résultat (vrais/faux) et tu stock le tout dans une liste d'objets (en faisant une classe comprenant la question, la réponse et le résultat par exemple). Ainsi pas moyen de confondre..

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    C'est vrai qu'en faisant comme ça, je ne vais pas mélanger

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    wow

    tu voulais enchainer dans le même void question / réponse / question / réponse ... ??

    il faudrait voir les bases de la programmation orientée objet avant de coder ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 896
    Points : 1 912
    Points
    1 912
    Par défaut
    Je pense que tu te représentes mal les choses. Je suppose tu fais une application fenêtrée en WinForm. Par définition ce que fait ce type d'application c'est justement attendre que l'utilisateur fasse quelque chose pour lui répondre. Donc quand l'utilisateur clique sur un bouton "Démarrer le Quizz" tu récupères les questions et tu l'affiche ; tu le laisses saisir une réponse, quand il la valide tu contrôles et tu affiche la question suivante ; s'il n'y a plus de question tu donnes le bilan. Tu n'as pas besoin de te préoccuper pour l'instant d'éléments de programmation plus avancés comme les ResetEvent ou async/await ; les thread par exemple servent des buts particuliers, comme libérer le thread de l'UI pendant un traitement long (récupérer un fichier sur le réseau par exemple). Je pense que tu devrais suivre un tutoriel sur la programmation événementielle en WinForm pour bien appréhender ces concepts.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Je programme en autodidacte, donc effectivement, je ne fais peut être pas comme il faut
    Ce que je voulais essayer de faire c'est un questionnaire sous forme de Windows Form mis au sein d'une autre interface (là j'essai de faire ce questionnaire dans un addIn de Powerpoint, je ne veux pas bloquer Powerpoint (et donc le thread de l'UI) en attendant la réponse (mettre un quizz dans un addin powerpoint c'est bizarre effectivement mais c'est pour apprendre).

    Mettre tout dans le même void d'event, ca implique de faire un switch case géant avec des variables globales pour récupérer les infos d'un event à l'autre, ca ne semble pas très "propre" effectivement.

    Qu'est ce que vous suggérez comme "architecture" ?
    Je voyais une méthode (ex: void Sequence() ) qui fait la trame et séquence les questions.
    Sequence appelle une méthode par question (ex: bool question1() )
    et chaque méthode question ne renvoit sa réponse qu'une fois l'event réponse émis(donné comme quitter la TextBox de réponse).
    1) Est ce que ca vous semble cohérent ?
    2) Si oui, comment vous faites pour ne pas bloquer l'UI en attendant la réponse (ce que javais fait précédemment, ca me bloquait et m'empechait meme de taper la réponse). Est ce que vous voyez plutot un async/await ?

  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    autodidacte ne veut pas dire improvisation, il y a des cours partout pour apprendre le c#
    après tu sauras comment faire (et ca n'impose pas de switch géant ou autre, tu peut avoir un code très propre et concis, qui sera aussi long que tu ais une ou cent questions)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    Citation Envoyé par droledenm Voir le message
    Je programme en autodidacte, donc effectivement, je ne fais peut être pas comme il faut
    Ce que je voulais essayer de faire c'est un questionnaire sous forme de Windows Form mis au sein d'une autre interface (là j'essai de faire ce questionnaire dans un addIn de Powerpoint, je ne veux pas bloquer Powerpoint (et donc le thread de l'UI) en attendant la réponse (mettre un quizz dans un addin powerpoint c'est bizarre effectivement mais c'est pour apprendre).

    Mettre tout dans le même void d'event, ca implique de faire un switch case géant avec des variables globales pour récupérer les infos d'un event à l'autre, ca ne semble pas très "propre" effectivement.

    Qu'est ce que vous suggérez comme "architecture" ?
    Je voyais une méthode (ex: void Sequence() ) qui fait la trame et séquence les questions.
    Sequence appelle une méthode par question (ex: bool question1() )
    et chaque méthode question ne renvoit sa réponse qu'une fois l'event réponse émis(donné comme quitter la TextBox de réponse).
    1) Est ce que ca vous semble cohérent ?
    2) Si oui, comment vous faites pour ne pas bloquer l'UI en attendant la réponse (ce que javais fait précédemment, ca me bloquait et m'empechait meme de taper la réponse). Est ce que vous voyez plutot un async/await ?
    Pourquoi n'a tu pas mentionné tout de suite que du développais un Add-In pour Powerpoint ?
    Nous avons tous cru que tu réalisais une application Windows Form et adaptés nos réponses sur ce fait.

    Je pense que ces liens peuvent t'intéresser :
    https://msdn.microsoft.com/fr-fr/library/aa942955.aspx
    https://msdn.microsoft.com/fr-fr/library/bb157865.aspx

    Il décrivent comment mettre en place un ruban dans Office et formulaire directement dans le ruban.
    Avec les différents liens présents sur ces pages tu devrais avoir tout ce qu'il faut pour continuer

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Merci pour vos réponses.
    Je vais effectivement suivre des tutos, je vois que j'ai des manques - et je reviendrai poser des questions sur le forum si malgré tout il y a des points que je ne comprends pas.

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

Discussions similaires

  1. [XL-2016] Attendre que la connection query soit terminée avant de poursuivre la code
    Par nonesofar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/11/2016, 14h08
  2. [PowerShell] Attendre la fin d'un process avant de continuer une boucle
    Par suchiwa dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 16/02/2011, 10h26
  3. Attendre qu'un recalcul soit effectué avant de continuer le code
    Par ANOVA dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 12/08/2010, 14h27
  4. Attendre la fin d'un script externe avant de continuer le script python
    Par Mistervanhalen dans le forum Général Python
    Réponses: 1
    Dernier message: 18/03/2009, 16h05
  5. Attendre qu'une fenetre soit fermée avant de continuer.
    Par parp1 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 29/05/2007, 17h43

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