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 :

Problèmes avec Chart


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut Problèmes avec Chart
    Bonjour, le problème d'aujourd'hui réside dans l'ajout de donnée dans un graphique.

    Je travail avec l'acquisition de données a partir d'une source RS232 (8bits/1 stop bit/19200 bps) et lors de l'ajout de mes données dans le graphique, il met une erreur de pointeur, alors que lorsque je met en commentaires ces deux lignes (1 par graphique) le programme tourne nikel)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    void __fastcall TFormMEC::CPortRxChar(TObject *Sender, int Count)
    {
        char *cRx = new char [Count];
        CPort->Read(cRx, Count);
        int index = 0;
        do
        {
            if((cRx[index++] == CHAR(0xFF))&&(Count >= 5))
            {
                int iVal1;
                int iVal2;
                double dVal;
                //Débit
                iVal1 = (int) cRx[index++];
                iVal1 += 128;
                iVal2 = (int) cRx[index++];
                iVal2 += 128;
                iVal2 *= 256;
                iVal2 += iVal1;
                dVal = (double)iVal2;
                //Ajout du debit dans le graphique
    //Erreur 1-> SerieDebit->AddXY(iTrame, dVal, "", clRed);
                //Pression
                iVal1 = (int) cRx[index++];
                iVal1 += 128;
                iVal2 = (int) cRx[index++];
                iVal2 += 128;
                iVal2 *= 256;
                iVal2 += iVal1;
                dVal = (double)iVal2;
                //Ajout du debit dans le graphique
    //Erreur 2-> SeriePression->AddXY(iTrame,iVal2, "", clRed);
                iTrame++;
                //Ajustement des echelles des graphiques
                if(iTrame > iEchelle)
                {
                    ChartDebit->BottomAxis->Maximum = iTrame;
                    ChartPression->BottomAxis->Maximum = iTrame;
                    ChartDebit->BottomAxis->Minimum = iTrame - iEchelle;
                    ChartPression->BottomAxis->Minimum = iTrame - iEchelle;
                    if(!iEchelle)
                    {
                        ChartDebit->BottomAxis->Maximum = iTrame;
                        ChartPression->BottomAxis->Maximum = iTrame;
                        ChartDebit->BottomAxis->Minimum = 0;
                        ChartPression->BottomAxis->Minimum = 0;
                    }
                }
                else
                    InitEchelle();
            }
            else
                index++;
        }
        while(index < Count);
    }
    Quelqu'un sais si les graphiques ont une fréquence de rafraichissement limite, ou alors ou est-ce que j'aurais fait mon erreur (aussi idiote soit-elle).

    Merci

  2. #2
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Salut,
    Il n'y a pas de limite de temps ou quoique ce soit dans l'ajout de point. Au pire, il ne rafraichit pas le TChart tant qu'il n'a pas la main.

    Je pense qu'il faut que tu mettes un point d'arrêt et que tu regardes la valeurs de iTrame.
    Quel est l'erreur que tu as?
    Quel est la valeur des variables avant l'erreur?
    Si c'est une question de temps, en pas à pas, tu ne devrais pas avoir d'erreur. Est ce le cas?

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut
    en fait j'ai mis un tit label pour visualiser la valeur de dVal, elle varie de 0 à 65535 (0x00 à 0xFF)

    le problème viendrait de la multiplication par 256 qui ne conviendrai pas.

    l'erreur est une erreur de pointeur (je peux pas retester maintenant mais je le ferais des que possible)

    Par contre, j'ai remarqué qu'avec ce code, j'utilisais 100% du CPU (un 2.80 GHz P4) ce qui me parrait énorme pour un simple bvoucle de calculs(je supose que les deux chart prennent énormément de ressources)

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut
    L'erreur que j'obtien est :
    Le projet MesureEnContinue.exe a provoqué une classe d'exception EInvalidPointer avec le message 'Opération de pointeur incorrecte'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    Pour quelques precisions, le programme scrute le port COM pour recevoir des trames de 8 octets (0xFF quatres octets utilisé, puis 3 octets non utilsé pour l'instant)
    Il y a un nombre de 100 trames par secondes (un mode 200 trame par secondes est envisagé, mais la n'est pas le problème) donc on a au moins 8000 bits par secondes de transféré (1 bit start, 1 bit stop et 8 bits de donnees, le tout sur 8 octets)

  5. #5
    Membre éclairé Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    Citation Envoyé par Galkir Voir le message
    en fait j'ai mis un tit label pour visualiser la valeur de dVal, elle varie de 0 à 65535 (0x00 à 0xFF)

    le problème viendrait de la multiplication par 256 qui ne conviendrai pas.

    l'erreur est une erreur de pointeur (je peux pas retester maintenant mais je le ferais des que possible)

    Par contre, j'ai remarqué qu'avec ce code, j'utilisais 100% du CPU (un 2.80 GHz P4) ce qui me parrait énorme pour un simple bvoucle de calculs(je supose que les deux chart prennent énormément de ressources)


    avec un tel code tu prendra 100% de ton uc meme si ta le tous dernier processeur.
    Sa vien du fait que tu boucle un grand nombre de fois (je présume) ... combien vaut iCount?

    Pour palier a ce prob met un Sleep(10); juste avant le while

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     else
                index++;
     
    Sleep(10);
        }
        while(index < Count);
    }

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut
    Count (et non pas iCount) est le nombre d'octets présents dans le buffer du port (le nombre d'octets a lire), et il a une valeur de 8 (normalement) mais plus le graphique a de point, plus il prend du temps a calculer (même pour un 2800 MHz) et le buffer augmente, pour passer de 8 à 16 vers les 10 secondes, et à 24 de temps en temps.

    Pour le Sleep(10) (ou tout autre valeur) ca fout la marde totale! donc solution non envisageable

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut
    Je vais simplifier ma demande (j'espere que c'est la clé du problème) :

    J'ai deux octets (char1 et char2) en entrée, et je souhaite avoir un double en sortie. (char2 étant le LSB et char1 le MSB, cad double = char1*256 + char2 le tout allant de 0 à 65535 [0x0000 à 0xFFFF])

    Comment faire cete conversion avec le moins d'instructions possibles?

    Code de la solution utilisé : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                iVal1 = (int) cRx[index++];
                iVal1 += 128;
                iVal2 = (int) cRx[index++];
                iVal2 += 128;
                iVal2 *= 256;
                iVal2 += iVal1;
                dVal1 = (double)iVal2;

    Edit : l'utilisation de TFastLine améliore la rapidité de la fonction

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut
    Une erreur, ou plutot un problème persiste.

    Sur ma fiche, j'y ai inséré deux composant Chart, avec chacun deux série de points.
    Mais le problème est que au bout de quelques secondes d'acquisition et de traitement, le premier Chart ne se rafraichis plus.
    Si j'ajoute la méthode ->Refresh(), je n'ai plus la main du tout, malgrès le problème résolu.
    Si enfin j'ajoute Application->ProcessMessage(), j'ai la main, les graph tournent bien, mais le temps de traitement étant trop long, j'en arrive a avoir plusieurs secondes de retard entre le changement de données d'acquisitions et l'affichage dans les graphiques.

    Y a-t-il une autre méhode que Refresh() qui soit moins gourmande, et qui me laisse la main pour agir sur ma fiche?

  9. #9
    Membre éclairé Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    le thread

    a part sa personnelement je voie pas

  10. #10
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Je sais que le point est marqué résolu, mais il existe une astuce pour l'affichage des courbes dans un TChart.

    Le fait que ca rame vient du problème du nombre de donnée dans la série.
    L'idée est de charger un série en RAM et d'afficher uniquement la partie souhaiter.

    Sinon, suivant comment se présente les données, il peut aussi être enregistrée de façon intelligente en supprimant les point non nécessaire au graphique (plusieurs point consécutifs à la même valeurs est inutile par exemple).

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut
    Alors, le problème est que je ne peux pas me permettre de supprimer de points (ils sont destiné à un traitement par un tableur, ou d'autres utilisations)

    Pour ce qui est d'aficher que les points intéréssants, non plus je ne peux pas, vu que j'ai des radio button me permettant de choisir tous les points, les 3000 derniers ou les 6000 derniers.

    Pour ce qui est de supprimer les points égaux, c'est possible, mais voyant mon graphique, je ne pense pas que ca me permette de gagner assez pour ne pas freez (ce sont des graphiques de débit et de pression entre une respirateur et un poumon)

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

Discussions similaires

  1. Problème avec Charts rickshaw
    Par toufik135 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 04/01/2015, 08h16
  2. Problème avec chart
    Par magil dans le forum FastReport
    Réponses: 1
    Dernier message: 13/06/2014, 18h17
  3. Problème avec chart en vb 2010
    Par Nnahaa dans le forum VB.NET
    Réponses: 2
    Dernier message: 02/05/2011, 19h20
  4. Probléme avec chart échelle log
    Par Mloody2000 dans le forum Débuter
    Réponses: 0
    Dernier message: 14/08/2008, 00h40
  5. problème avec l'insertion de chart
    Par rades2006 dans le forum iReport
    Réponses: 2
    Dernier message: 18/04/2007, 15h12

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