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

Windows Forms Discussion :

Bloquer l'empilement des évènements


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 13
    Points
    13
    Par défaut Bloquer l'empilement des évènements
    Bonjour,
    Je viens de développer une petite application de prise de photo via une caméra. Elle permet de se prendre en photo et d'effectuer quelques traitements d'images.
    Mon problème survient lors de la prise de photo, l'interface utilisateur ne se bloque pas, je peux donc cliquer sur tout les autres boutons.
    Les évènements sont alors créés et empilés. Lors de la fin de prise de la photo sa devient gênant d'avoir tout qui arrive d'un coup

    J'ai essayé plusieurs possibilité en rendant inactif les boutons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    this.back.enabled =  false; 
    //Mon traitement
    this.back.enabled =  true;
    Egalement la suppression de l'EventHandler;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    this.back.Click -= new System.EventHandler(this.backClick);
    //Mon traitement
    this.back.Click + new System.EventHandler(this.backClick);
    Rien à faire...
    Voila si vous avez une idée pour court circuiter l'empilement des évènements et donc de ne pas les traiter.
    Merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Désactivé les contrôles était la bonne solutions, mais il faut le faire au début du handler de l'événement.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Merci de ta réponse,
    Malheureusement je fais déjà la suppression au début handler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private void PhotoClick(object sender, EventArgs e)
    {
           this.back.Click -= new System.EventHandler(this.backClick);
     
           //Mon traitement
     
           this.back.Click + new System.EventHandler(this.backClick);
    }
    Durant mon traitement je fais appel à un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     System.Threading.Thread.Sleep(3000);
    pour passé d'un mode preview à un mode résolution maximum. J'ai l'impression que c'est a se moment que les évènements sont empilés...

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Je confirme que ce code est la bonne solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void PhotoClick(object sender, EventArgs e)
    {
           this.back.enabled =  false;
           //Mon traitement
           this.back.enabled =  true;
    }
    Pendant ton traitement, le bouton "back" sera desactivé, et donc il sera impossible de cliquer desssus.

    Pendant ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Threading.Thread.Sleep(3000);
    Le Main-Thread est bloqué, il est donc aussi impossible d'empiler des événements.

    Vu que tu bloque pendant 3s, ton application devrait paraitre freezé pendant 3s. Tu devrais faire verifier qu'elle est bien freezé, si ce n'est pas le cas, c'est que ton appli ne correspond pas à ta source, ou que tu ne passes pas par cette portion code.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Mon application est bien freezé, windows m'affiche même un message pour me demander d'attendre que le programme réagisse ...
    Et pourtant une fois le traitement passé tous les boutons ou j'ai cliqué pendant celui-ci, exécutent leur fonction les uns après les autres

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    Je confirme.
    J'ai la même erreur que toi, je ne comprends pas pourquoi.
    Je mets mon bouton ENABLE à false avant mon traitement mais les event click sont aussi empilés...
    Bizarre.
    Tox

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Du coup je viens de tester.

    Il y a deuxième problème, c'est parce que tu fais ton traitement dans le main-thread. Si tu fais ton traitement dans un backgroundworker, le bouton est bien désactivé.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Hum grosse modification en prévision alors
    Et effectivement cela expliquerais pourquoi les boutons restent activés, je place en résolu.
    Merci antoine.debyser !

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    Ha ouai, il faut carrément mettre un backgroundWorker...
    Je vais tester de mon coté pour voir si ca marche.
    Tox

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    Bonjour,

    J'ai testé la solution du backgroundworker.
    Ça ne marche pas (pour le multi click).
    Il "disable" bien le bouton pendant le traitement, par contre les évènements "Click" sont quand même empilés.

    J'ai du ajouter Application.DoEvents() au début de mon évènement "Click" pour palier ce problème.

    Du coup il empile juste un évènement quand on multi click sur le bouton pendant le traitement du backgroundworker, et plus 5 fois fois comme avant...

    A+
    Tox

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

Discussions similaires

  1. Problème avec la gestion des événements
    Par CynO dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 10h07
  2. [JTable] gestion des événements
    Par soulhouf dans le forum Composants
    Réponses: 4
    Dernier message: 19/08/2005, 13h21
  3. Gestion des évènements lors d'un clique sur une image.
    Par yoghisan dans le forum Débuter
    Réponses: 7
    Dernier message: 23/06/2005, 19h04
  4. Créer des événements
    Par thebeb dans le forum MFC
    Réponses: 8
    Dernier message: 04/02/2005, 16h45

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