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++Builder Discussion :

événements mélangés


Sujet :

C++Builder

  1. #1
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 116
    Points
    116
    Par défaut événements mélangés
    Bonjour à tous.

    Je suis en train d'essayer de résoudre un problème de mouvement interactif.

    J'ai une image. Dans les événements de cette image j'ai défini des actions à faire lorsque j'appuie sur le bouton de ma souris (MouseDown), lorsque je la bouge (MouseMove) et lorsque je lâche le bouton (MouseUp).

    Mon problème est que les événements sont trop rapidement détectés avant que j'aie fini mon boulot. Par exemple, un événement MouseMove intervient qui déclenche un bout de code, et avant que j'aie terminé ce code, un deuxième événement MouseMove se déclenche. Je voudrais bien avoir la paix tant que mon code n'est pas terminé ...

    Ce n'est qu'un exemple parmi d'autres. En fait tout se mélange parce que mes événements continuent à arriver pendant que je traite les précédents, alors que je voudrais bien en faire abstraction pendant ce temps (c'est-à-dire les négliger complètement, comme s'ils n'avaient pas lieu du tout). Ce n'est pas facile à gérer : par exemple, je pourrais décider d'enregistrer dans une variable l'état dans lequel je me trouve et tester cette variable à chaque événement pour savoir si j'ai le droit de prendre la main : si oui, je donnerai à cette variable une valeur qui interdira à tout autre événement d'intervenir. Mais le problème est que je dois prévoir le cas où deux événements simultanés feraient le test en même temps et croiraient tous deux avoir le droit d'agir !!! On n'en sort pas.

    Existe-t-il un moyen de bloquer l'accès à une variable. Si oui, je serai sauvé. Même si deux événements tentent de bloquer simultanément la même variable, seul l'un d'entre eux y parviendra.

    Merci pour toute suggestion.

    Titre modifié par Greybird
    Ecrire en majuscules, c'est CRIER. Impoli donc.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 49
    Points : 51
    Points
    51
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TForm1::TrucMouseMove(...)
    {
       Truc->OnMouseMove=NULL;
       // Traitement
       ...
       Truc->OnMouseMove=TrucMouseMove;
    }
    Cela devrait régler votre problème.

  3. #3
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 116
    Points
    116
    Par défaut onmousemove
    Ben oui ! J'y ai bien pensé. Mais il faudrait faire la même chose pour OnMouseUp, et OnMouseDown. Et ça n'empêchera pas, pendant ce temps, qu'une autre routine fasse de même et que tout soit quand même mélangé...

    Pour Greybird,

    Désolé, je ne voulais pas être impoli... Je le saurai désormais.

  4. #4
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut Re: événements mélangés
    Citation Envoyé par ceugniet
    Par exemple, un événement MouseMove intervient qui déclenche un bout de code, et avant que j'aie terminé ce code, un deuxième événement MouseMove se déclenche. Je voudrais bien avoir la paix tant que mon code n'est pas terminé ...
    Les événements sont dépilés un à un.
    Donc tant que tu ne fais pas de multithread, tu es sûr que tout ton code sera exécuté avant que tu passes au traitement de l'événement suivant.

  5. #5
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 116
    Points
    116
    Par défaut
    Merci pour vos réponses.

    Je ne suis pas d'accord avec Greybird. Je ne fais pas de multithread "sciemment" ( en ce sens que je ne sais même pas lancer un thread ! ). Par contre le "système" qui m'encadre le fait à l'évidence. Sinon, je n'aurais pas de problème. Je n'excluais pas au départ une erreur de logique de programmation, mais j'ai vérifié, à l'aide de la clock rapide QueryPerformanceCounter (il se trouve que sa fréquence est égale à la cadence de mon nouveau PC, 3GHz), que malgré que je me sois contenté de définir les actions à faire en cas de MouseDown, de MouseMove et de MouseUp en clickant sur les cases correspondantes sur l'inspecteur d'objet, il est clair que parfois je démarre l'action à faire en cas de Mousemove AVANT d'avoir terminé la précédente (action de Mouve Move). Cela signifie donc que le système prend en compte un nouveau mouvement de la souris avant que j'ai fini de traiter celui qui est en cours...

  6. #6
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Bonjour,

    ceugniet, je suis désolé, mais c'est le fonctionnement de Windows de faire dépiler la pile de message un par un par la boucle de traitement de messages du programme.
    Le système ne fait que rajouter l'événement dans la pile de message, que l'application dépile un par un.

    Au pire, ça pourrait être du à l'hyperthreading, encore que je vois mal comment il pourrait interférer avec un programme single thread. Là je maitrise pas.

    Cordialement,

    Arnaud

  7. #7
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    Citation Envoyé par Greybird
    ceugniet, je suis désolé, mais c'est le fonctionnement de Windows de faire dépiler la pile de message un par un par la boucle de traitement de messages du programme.
    Le système ne fait que rajouter l'événement dans la pile de message, que l'application dépile un par un.
    Mis à part lors de l'usage d'un "Application->ProcessMessages()", je suis d'accord avec Greybird : un événement (OnMouseMove par exemple) est traité entièrement avant de passer au message suivant.

    Nicolas

  8. #8
    Membre habitué
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    t'as mis des break-point pour vérifier tes dires ?? moi aussi je suis assez sceptiques parce que j'utilise régulièrement ce genre d'évenements et c'est vrai que parfois il se passe des choses bizarres, mais en regardant de plus près, je m'apercois toujours que c'est moi qui écrit des choses bizarres ... je me demande vraiment quand Borland fera ce que je veux et pas ce que je dis ...

  9. #9
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 116
    Points
    116
    Par défaut
    Greybird,

    Je crois bien que c'est toi qui as raison. J'ai fait un autre test, dans un contexte plus simple que le programme sur lequel je suis en train de travailler, où je me contente de noter les heures de début et de fin des codes déclenchés par les MouseDown, MouseMove et MouseUp (dans ces trois bouts de code, je déclenche des calculs très longs, exprès). J'ai effectivement constaté qu'à aucun moment, le mélange auquel je fais allusion dans le titre ne se produisait. Comme de plus tu confirmes de façon catégorique, je n'ai plus de doute à avoir. Il faut croire donc que c'est bel et bien la logique de mon programme qui laisse à désirer.

    Merci de ton aide pour cette nouvelle certitude (les certitudes sont rares pour C++ en ce qui me concerne).

    Puis-je en déduire qu'il n'y a pas d'interruption ? Que les portions de code seront toujours exécutées dans l'ordre où les "click" correspondants ont eu lieu ? Quel bouleversement se produit alors si on lance l'Application-ProcessMessages() évoqué par Nicolas ?

    Nicolas,

    J'avais effectivement, à un moment, inséré un Application->ProcessMessages() (qui s'est révélé inutile et que j'ai enlevé par la suite) : ceci explique peut-être cela, car je ne me souviens plus entièrement de l'ordre de mes diverses démarches...

    Freeze

    t'as mis des break-point pour vérifier tes dires ??
    Est-ce à moi que tu t'adresses ou à Greybird ? Si c'est à moi, la réponse est non : je ne peux rien analyser avec des break-points dans ce cas-là vu que le moindre mouvement de souris réduirait à néant mes volontés de suivre pas à pas le déroulement du programme ; de plus le PC réagit à la microseconde (si ce n'est plus vite) alors que moi, au mieux, c'est à la seconde !!!

    Je suis malgré tout content de voir que je ne suis pas le seul infortuné. La différence entre toi et moi est que moi je n'ai pas encore compris ce qui était réellement arrivé dans mon programme.

    Merci à vous tous pour ce dialogue très riche en enseignements.

  10. #10
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par ceugniet
    Quel bouleversement se produit alors si on lance l'Application-ProcessMessages() évoqué par Nicolas ?

    Nicolas,

    J'avais effectivement, à un moment, inséré un Application->ProcessMessages() (qui s'est révélé inutile et que j'ai enlevé par la suite) : ceci explique peut-être cela, car je ne me souviens plus entièrement de l'ordre de mes diverses démarches...
    Si on appelle "Application->ProcessMessages" dans le traitement d'un évènement (ev1), le traitement est interrompu pour que Windows traite tous ses messages en attente ==> donc on va passer dans le traitement du second événement (ev2) AVANT de terminer celui de ev1.
    Ceci peut donc laisser penser que les événements sont "mélangés".

    Nicolas

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

Discussions similaires

  1. Pas d'événement OnClose quand on arrête W2K
    Par Altau dans le forum C++Builder
    Réponses: 9
    Dernier message: 26/01/2009, 18h36
  2. Réponses: 5
    Dernier message: 09/01/2003, 11h55
  3. exploiter un évènement d'un sous composant dans un
    Par bjl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/12/2002, 16h44
  4. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  5. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10

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