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 :

Suspendre les events d'un UserControl


Sujet :

Windows Forms

  1. #1
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut Suspendre les events d'un UserControl
    Bonjour tout le monde,

    j'ai créé un composant graphique (classe héritant du UserControl) et pour laquelle j'ai défini (à cause des besoin de l'application) plusieurs event (KeyPress, ProcessCmdKey, MouseUp, MouseDown, MouseMove, ...)

    actuellement, j'essaye de suspendre les event KeyPress et ProcessCmdKey pour les empêcher d'exécuter leurs traitements pendant l'exécution d'un autre event : MonseClick,

    seulement je ne sais pas comment faire, puisque la fameuse méthode qui consiste à ajouter ou soustraire l'event à un control ne marche pas !!
    et je pense que c'est évident puisqu'elle doit être appliquée sur une instance et non au milieu de la classe du contrôle graphique.

    j'espère que j'ai été assez clair,
    Merci d'avance
    bien cordialement

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 381
    Points : 2 995
    Points
    2 995
    Par défaut
    pour avoir été confronté au problème, la meilleure solution (et surtout la plus simple) consiste à définir une propriété sur ton usercontrol pour indiquer si un traitement doit se faire ou non. Et dans le code des évènements, tu testes la valeur de cette propriété pour savoir ce qu'il faut faire.

  3. #3
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    pour avoir été confronté au problème, la meilleure solution (et surtout la plus simple) consiste à définir une propriété sur ton usercontrol pour indiquer si un traitement doit se faire ou non. Et dans le code des évènements, tu testes la valeur de cette propriété pour savoir ce qu'il faut faire.
    salut,

    merci pour ta réponse,
    je voulais éviter cette solution, j'aurai aimer que cela se fasse de manière plus esthétique

    mais s'il n'y a pas d'autre solution, j'ai pas le choix

    Merci beaucoup
    Bien cordialement

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 381
    Points : 2 995
    Points
    2 995
    Par défaut
    ah mais je n'ai pas dis que c'est la seule solution, juste que c'est le plus simple.

    J'ai eu le problème récemment. En fait, ce que tu envisageais au départ est réalisable mais difficile si tu as des procédures imbriquées. Par exemple, dans mon code je me suis retrouvé avec un code d'évènement exécuté 2 fois, et je n'ai jamais pu déboguer ça. Chaque procédure désactivait un évènement en faisant un -= d'abord puis un += pour refaire le lien avec l'évènement. Mais parfois tout était imbriqué (mal conçu, d'accord :-( ) et du coup, je devais quelque part en ajouter un de trop.

    J'ai résolu ce problème avec la technique (pas propre, ok ;-) ) cité plus haut.

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    cependant la logique voudrait qu'un composant emette les evenements, et que ce soit le consommateur qui en dispose à sa guise

    Celà dit, il y a quelques classes dans le Framework .Net (comme par exemple le FileWatcher) qui ont une propriété RaiseEvent utilisé pour lever ou pas certains evenements

    Perso, je pense que si tu veux que ton composant soit réutilisable par d'autres équipes que la tienne ou d'autre personne que toi, il serait plus "propre" si cela est envisageable et possible, de faire que cette logique d'abonnement soit au niveau de l'utilisateur et non du composant en lui même
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    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 150
    Points : 25 066
    Points
    25 066
    Par défaut
    overrides les void qui déclenchent les évènements (OnQuelqueChose)
    et si tu n'est pas en train de faire ton traitement, tu appelle base.OnQuelquechose (si tu ne l'appelles pas, l'évènement ne sera pas déclenché)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    overrides les void qui déclenchent les évènements (OnQuelqueChose)
    et si tu n'est pas en train de faire ton traitement, tu appelle base.OnQuelquechose (si tu ne l'appelles pas, l'évènement ne sera pas déclenché)
    bonjour,

    Merci à vous tous pour vos réponses,
    @Pol63 : ce que j'essaye de faire exactement, c'est de suspendre l'utilisation de l'event OnKeyPress pendant l'appel du OnMouseDown, et de le rétablir à la fin de l'appel de l'event OnMouseUp

    Merci d'avance
    Bien cordialement

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 058
    Points : 12 093
    Points
    12 093
    Par défaut
    Votre méthode est bien trop fragile face à la réentrance et le multithreading.
    Une méthode simple et sûr, qui vient du monde JAVA via l'implémentation des méthodes synchronisées et de verrouillé l’objet courant.
    Donc au début de chaque méthode de traitement des évènements :

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 381
    Points : 2 995
    Points
    2 995
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Votre méthode est bien trop fragile face à la réentrance et le multithreading.
    Une méthode simple et sûr, qui vient du monde JAVA via l'implémentation des méthodes synchronisées et de verrouillé l’objet courant.
    Donc au début de chaque méthode de traitement des évènements :
    Tu pourrais donner un exemple concret stp ?

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    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 150
    Points : 25 066
    Points
    25 066
    Par défaut
    je vois pas ce que lock vient faire dans cette discussion
    de plus il me semble lock n'interdit pas la réantrance du même thread
    et puis chose curieuse sur lock, dans msdn ils disent de ne pas faire lock sur this et dans le framework c'est ce que microsoft fait pourtant en général ...

    @papy
    lock permet de sécuriser du multithreading
    le multithreading est quelque chose de simple à comprendre à première vue mais finalement assez complexe aux vues des problèmes que ca peut causer
    par exemple si un thread fait un for each sur une collection et qu'un autre thread fait .add sur cette collection, celui qui faisait for each plante
    ou encore si 2 thread lisent une propriété pour y ranger +1, il y a des chances pour que ca ne fasse que +1 au lieu de +2 car ils ont auront lu la meme valeur en meme temps
    donc il y a des outils pour éviter les soucis, comme lock et les readerwriterlock, les incrément atomiques etc...
    lock ca permet qu'une méthode ne soit utilisée par un seul thread à la fois
    le 1er thread qui passe sur le lock acquiert le verrou et passe dans le code
    ceux qui arrivent derrière reste en attente sur la ligne lock en attendant que le thread qui est dedans sorte, et donc ils passent un par un
    le readerwriterlock permet lui de différencier 2 niveaux d'accès, read et write, dans certains cas il est recommandé car il évite de perdre trop de temps
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 058
    Points : 12 093
    Points
    12 093
    Par défaut
    de plus il me semble lock n'interdit pas la réantrance du même thread
    Justement, cela permet de correctement gérer les problèmes du style :
    Je passe dans un événement donc je fais -= sur mon delegate toto.
    En cour de traitement j'appel une méthode qui faut aussi -= sur mon delegate toto.
    Ma méthode interne fait += de mon delegate toto.
    Ma méthode externe fait += de mon delegate toto.

    Résultat : 2 fois le delegate toto sur le même évènement. Cool

    Le fait de faire un lock(this) dans tout les évènements à sérialiser empêche plusieurs threads d'entrer dans l'objet.
    Faire des lock(this) peut entraîner des deadlocks si on fait n'importe quoi et justement qu'en on veux avoir la possibilité de faire plusieurs choses en même temps sur un objet. C'est justement le cas que l'on veut éviter.

    L'utilisation de se lock simplifie la consultation des propriétés en milieu multithread car la méthode préconisé est extrêmement fragile vis-à-vis de ce problème.

    Le lock(this) permet d'implémenter les méthodes synchronised de JAVA.

Discussions similaires

  1. Les events de mon UserControl ne marche pas
    Par obitskater dans le forum ASP.NET
    Réponses: 22
    Dernier message: 03/06/2008, 12h13
  2. [Forms-PJC]Les events en dehors de mon wrapper
    Par patmaba dans le forum Forms
    Réponses: 13
    Dernier message: 16/06/2006, 13h05
  3. Capturer les event de ma souris en dehors de mon appl
    Par bpy1401 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 28/07/2005, 17h59
  4. les event de IBQuery pour activer,desactiver la Transaction?
    Par amad206 dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/03/2005, 15h12
  5. Gérer les events d'un tableau de boutons
    Par lord_kalipsy dans le forum wxWidgets
    Réponses: 7
    Dernier message: 20/10/2004, 11h13

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