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

MFC Discussion :

[MFC] graphique temps réel


Sujet :

MFC

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2002
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 17
    Points : 15
    Points
    15
    Par défaut [MFC] graphique temps réel
    bonjour, j'ai créer une application capable de dessiner une courbe avec acquisition des données en temps réel.

    Le problème c'est qu'en fait, à chaque ajout de point toute la courbe est redessiner. Comment faire pour ne dessiner que le point ajouté ( quel messages ?)

    Pour le moment j'initialise mon graphique dans l'évenement WM_PAINT et je dessine un point dans WM_TIMER, cependant si je ne fais pas un update rien ne s'affiche et si je le fais tout est redessiné ... avez vous une idée ?

    merci

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    il me semble que la question a deja ete posée sur le forum.
    il faut que tu stockes les commandes de dessin dans une liste d'objet a partir d'un vector pas exemple et sur le WM_PAINT tu pacours ta liste et tu redessines tout .

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2002
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    j'ai vu cette discussion mais je ne pense pas que ça corresponde à mon cas.
    J'arrive très bien à dessiner la courbe en temps réel. Mon problème est plutôt le suivant.
    ce que je fait:
    1)J'initialise mon graphique (axes, echelles ...)
    2)J'initialise un timer qui va lire toutes les secondes dans le buffer du port RS232 une acquisition et l'ajoute à ma classe courbe qui contient tous les points (entre autre)
    3)je redessine la courbe à chaque fois que je rajoute un point (par un update)
    4)si le graphique sort de la zone je fais un zoom arrière en ajoutant le 1/3 de l'échelle précedente pour afficher tout le graphique

    le problème:
    ça marche très bien tant que le nombre de point est faible (<20000) mais après le temps de redessiner la courbe augmente et ça fait clignoter l'affichage (ce qui est très desagreable)

    ce que je veux
    1)J'initialise mon graphique (axes, echelles ...)
    2)J'initialise un timer qui va lire toutes les secondes dans le buffer du port RS232 une acquisition et l'ajoute à ma classe courbe qui contient tous les points (entre autre)
    3)je dessine le point que je viens d'ajouter
    4)si le graphique sort de la zone je fais un zoom arrière en ajoutant le 1/3 de l'échelle précedente pour afficher tout le graphique et je ne recommence qu'à redessiner les points qui s'ajoutent

    J'ai essayer de ne pas faire l'update mais évidemment les points ne sont plus dessiner ... une idée ?

    merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    Hello,

    Je n'ai pas de solution directe à ton pb juste deux idées :

    - dessiner le graphique dans une image en y ajoutant les points au fur et à mesure et en même temps les dessiner à l'écran, et quand tu dois redessiner tout le graphique, tu reaffiche l'image par StrechDIB

    - est ce que changer l'echelle est indispensable : si tu fais un Scroll en effacant les données les plus anciennes ce n'est pas mieux pour conserver une bonne lisibilité au graphique.

    a+

  5. #5
    mat.M
    Invité(e)
    Par défaut
    ça marche très bien tant que le nombre de point est faible (<20000) mais après le temps de redessiner la courbe augmente et ça fait clignoter l'affichage (ce qui est très desagreable
    C'est une très mauvaise méthode ,Il ne faut pas redessiner 20000 points !!

    La solution comme l'a suggéré Farscape c'est de mémoriser les points dans par exemple une classe comme CArray ( voir MSDN ) en fait une template de tableau dynamique.
    Il faut créer 2 tableaux dynamiques : une sélection courante qui affichera à l'écran un intervalle donné de points par exemple 2000 points et un autre tableau dynamique qui mémorisera la TOTALITE des données / points acquis.

    A programmer il faut 2minutes 14 pour faire cela .
    En fait lorsqu'on fait défiler la visualisation des points ( scrolling ) il suffit de lire le tableau dynamique de type CArray d'une borne inf. à une borne sup.

    - dessiner le graphique dans une image en y ajoutant les points au fur et à mesure et en même temps les dessiner à l'écran, et quand tu dois redessiner tout le graphique, tu reaffiche l'image par StrechDIB
    Oui cela s'appelle créer un "DC en mémoire" , voir la FAQ.
    Sinon pour faire défiler la vue courante on peut utiliser CScrollView

  6. #6
    mat.M
    Invité(e)
    Par défaut
    bonjour, j'ai créer une application capable de dessiner une courbe avec acquisition des données en temps réel.
    .....
    Pour le moment j'initialise mon graphique dans l'évenement WM_PAINT et je dessine un point dans WM_TIMER, cependant si je ne fais pas un update rien ne s'affiche et si je le fais tout est redessiné ... avez vous une idée ?
    Attention car qui nous dit que chaque événement WM_TIMER est placé dans la boucle de message de l'appli à interalles réguliers ???
    Si au niveau matériel il ya des temps de latence ou bien l'acquisition ne s'effectue pas très précisément à un temps donné , les données acquises sont fausses.

    Les timers ne sont pas toujours bien précis et c'est un peu juste pour du temps réel.
    Il est peut-être envisageable d'avoir recours à une programmation avec threads

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2002
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par mat.M
    Attention car qui nous dit que chaque événement WM_TIMER est placé dans la boucle de message de l'appli à interalles réguliers ???
    Si au niveau matériel il ya des temps de latence ou bien l'acquisition ne s'effectue pas très précisément à un temps donné , les données acquises sont fausses.

    Les timers ne sont pas toujours bien précis et c'est un peu juste pour du temps réel.
    Il est peut-être envisageable d'avoir recours à une programmation avec threads
    oui, je n'ai pas vraiment préciser le contenu de mon programme mais en fait je regarde toute les 300ms pour une acquisition qui est censée avoir lieu toutes les secondes avec calcul du CRC pour la validité de la transaction ... bref l'acquisition n'set pas un problème en soit et je ne fait pas une appli critique au niveau du temps réel.

    Citation Envoyé par Mat.M
    A programmer il faut 2minutes 14 pour faire cela
    je sais et ce n'est d'ailleurs pas là le problème.

    Si je souhaitais seulement faire un oscilloscope alors faire défiler le graphique n'est pas un problème. Mon problème rentre dans la survaillance d'un processus qui peut aller de quelques minutes à un an.
    Je dois donc avoir le processus complet sous les yeux.

    Je vais plutôt me tourner du côté de la solution de runn2 en dessinant dans une image.

    Merci pour vos idées

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    En utilisant la serie de fonction :
    "Region Functions"
    tu peut calculer la "region" a rafraichier et ne dessiner que la portion d'image nouvell (PaintRgn), le tout c'est d'avoir le bon CDC pre preparer, non ?
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  9. #9
    Membre régulier

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2002
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 216
    Points : 120
    Points
    120
    Par défaut
    J'ai déja fait ceci dans 2 applis.
    avec les evenements Timer on peux faire l'acquisition à une fraquence donnée mais on peux faire l'affichage avec un autre Timer moins rapide ,je ne voie pas l'interet par exemple d'actualiser l'affichage toute les 100ms alors que toutes les 300,500ms voire toutes les secondes peuvent etre suffisant de plus sur 1000 et quelques pixels d'un ecran je ne voix pas l'interet de vouloir en afficher plus qu'il ne peut (20000) donc en sautant un certain nombre de points à l'affichage on ne voie pas la différence !
    j'avais utilisé les classe derivées de CArray, j'utilisai 2 index :
    un qui était la taille de remplissage du tableau et l'autre un index secondaire qui dans une boucle me permetait d'afficher tant qu'il était inferieur a l'index de taille maxi que j'avais initialisé avec la precedente acquisition, même si le tableau avait augmenté de taille durant l'affichage, au prochain evenement Timer d'affichage j'affiche les point de l'index 2 jusqu'au nouvel Index 1 (de taille max reactualisé)

  10. #10
    Membre à l'essai
    Inscrit en
    Octobre 2002
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    je n'ai qu'un seul timer mais comme tu le dis je ne rafraichis l'écran que lorsque j'ai fais l'acquisition d'un nouveau point, soit toutes les secondes (enfin j'ai une méthode addpoint qui rafraichi l'écran lorsque je l'appelle.
    Mais comme tu le dis il ne sert à rien d'afficher 20000 points alors que au max je ne peux en afficher qu'un petit millier, enfin bien sur je peux avoir jusqu'a 100 courbes ... ce qui fait quand même au max 1 millions de points ... mais ça c'set un autre problème). mais c'est vers cette direction que je vais continuer à chercher.

    Citation Envoyé par MarcG
    En utilisant la serie de fonction :
    "Region Functions"
    tu peut calculer la "region" a rafraichier et ne dessiner que la portion d'image nouvell (PaintRgn), le tout c'est d'avoir le bon CDC pre preparer, non ?
    C'est bien ce que je pensais faire mais je n'arrive jamais à rafraichir la zone ...

    Sinon savez vous si avec directx ça sera plus rapide et si l'on peut facilement intégrer une image géré par directX dans une CView?

  11. #11
    Membre à l'essai
    Inscrit en
    Octobre 2002
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    bon ... mea culpa ... en fait ça marchait depuis le début ...
    en fait j'avais une classe courbe et une classe axe qui contient des courbes mais aussi la transformation du CDC pour pouvoir dessiner mes courbes à la bonne échelle en changeant l'origine et la taille du CDC. Or quand je redessine tout je fais appel à une méthode qui remet ces paramètres aux bonnes valeurs ... et quand j'ajoutais juste un point j'oubliais de le faire ...

    Donc finallement, ce que je fais et qui marche très bien c'est :
    - je dessine mes axes
    - j'ajoute mes points au fur et à mesure que je construis la CList contenant mes points et je les dessines
    - si le point sort je fais un update et tout se redessine nickel ...

    Merci à tous pour vos conseils et votre aide

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

Discussions similaires

  1. Visual Studio Express 2010 ou 2012 + Graphique Temps Réels
    Par Jolt0x dans le forum Windows Forms
    Réponses: 11
    Dernier message: 01/08/2013, 12h37
  2. [WD16] Graphique Temps réel
    Par Dynamic dans le forum WinDev
    Réponses: 4
    Dernier message: 02/11/2011, 09h44
  3. graphique temps réel
    Par ben1015 dans le forum LabVIEW
    Réponses: 5
    Dernier message: 13/10/2009, 20h44
  4. Quel outil pour une appli graphique "temps réel"
    Par Colargole dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 03/04/2009, 14h08
  5. Graphique temps réel (TPerformanceGraph)
    Par floppy64 dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/05/2006, 00h15

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