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

Dotnet Discussion :

[WinForms]Comment sont gérés des clics rapides sur un bouton


Sujet :

Dotnet

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut [WinForms]Comment sont gérés des clics rapides sur un bouton
    Bonjour à tous,

    Imaginons un traitement long appelé lors d'un clic sur un bouton, que se passe-t-il si je clique plusieurs fois sur ce bouton très rapidement :
    • Les évènements clic sont gérés les un après les autres après que chaque traitement pour un clic ait été effectué?
    • Le traitement du premier évènement peut être interrompu pour commencer le traitement du deuxième?
    • Seul le premier clic est géré, les clics suivant n'étant pas "enregistrés" puisque l'application effectuait déjà un traitement?
    • ...


    Merci d'avance à tous ceux qui pourraient m'éclairer,
    Nicolas

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    me semble que :
    Les évènements clic sont gérés les un après les autres après que chaque traitement pour un clic ait été effectué
    Mais la solution c'est le multithreading afin de ne pas attendre la fin de ton traitement.
    Tu créai un thread pour chaque clic sur ce bouton et tu execute ta fonction, ainsi tu n'es pas obligé d'attendre la fin du traitement de l'opération, et les fils d'execution s'effectue de manière concurente. (sauf si bien sûr tu as besoin que le traitement du premier clic soit effectuer pour entamer l'execution du deuxieme comme pour les base de données les calculs et toute utilisation d'une ressource partagée)
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    De ma connaissance du fonctionnement de la gestion des messages de Windows, je dirais aussi qu'il devrait gérer chaque clic l'un après l'autre.

    Par contre je n'ai pas bien compris ta deuxième phrase (je m'étais mal exprimé dans ma question, cela vient surement de là )

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    J'ai édité trouves-tu ça plus compréhensible ?
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 122
    Points : 124
    Points
    124
    Par défaut
    Ca n'a peut-etre rien à voir, mais si tu veux empêcher cette possibilité, tu peux Disabler le bouton en début de traitement, et l'Enabler à la fin...

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Oui je comprend mieux

    Mais mon but n'est justement pas de pouvoir exécuter des tâches parallèles mais d'empêcher que l'on ne clique plusieurs fois sur un bouton si on n'y prend pas garde.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Citation Envoyé par joujou_le_fou
    Ca n'a peut-etre rien à voir, mais si tu veux empêcher cette possibilité, tu peux Disabler le bouton en début de traitement, et l'Enabler à la fin...
    C'est justement ce que je fais mais ça ne semble pas fonctionner :s

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 122
    Points : 124
    Points
    124
    Par défaut
    C'est justement ce que je fais mais ça ne semble pas fonctionner :s
    C'est à dire?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    Dans ce cas joujou t'as mis sur la voie:
    Met la propriété enabled de ton bouton a false lors du traitement et un backgroundworker est en général utilisé pour les traitement long (ça evite que ton interface freeze), utilise l'event RunWorkerCompleted pour repasser la valeur enabled de ton bouton a true.
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Je viens de retester, je m'étais simplement trompé dans la lecture de mes logs :
    les évènements sont bien appelés les uns après le autres (même si je n'ai rien affirmé ici je pensais que ce n'était pas le cas)

    Citation Envoyé par joujou_le_fou
    C'est à dire?
    Si jamais la fenêtre prend trop de temps à être désactivée, ce qui peut être simulé avec un thread.sleep(), on peut générer plusieurs évènements de clic avant qu'elle ne soit désactivée.

    Je suis bien conscient que c'est extrêmement rapide de désactiver une fenêtre et que le commun des mortels n'aura sans doute jamais le temps de générer deux clics pendant le temps que cette opération s'effectue (ou plutôt avant que la fonction ne soit appelée, ce qui est plus plausible) mais ça peut arriver...

Discussions similaires

  1. Comment afficher correctement des Balloon ToolTip sur des contrôles?
    Par NicolasJolet dans le forum Windows Forms
    Réponses: 22
    Dernier message: 31/12/2021, 14h42
  2. [HTML] "Nested tags", comment sont interpretées des balises imbriquées ?
    Par Sunchaser dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 25/03/2009, 12h12
  3. Comment faire défiler des images comme sur le site suivant
    Par tidus_6_9_2 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/01/2008, 14h32
  4. Réponses: 2
    Dernier message: 26/11/2006, 21h10
  5. [c#] Comment sont gérés les noms de DataTable dans un DataSet ?
    Par Seth77 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 10/09/2006, 19h02

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