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 :

Meilleure Méthode pour parcourir un tableau


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 43
    Points : 30
    Points
    30
    Par défaut Meilleure Méthode pour parcourir un tableau
    Bonjour,

    J'ai eu du mal a trouver un titre pour ce que je cherche a faire

    J'ai un tableau CArray d'une Structure.

    Ce Tableau contient en fait des plages.
    Structure :
    IdPlage
    DateDebut
    DateFin

    J'affiche ses plages sur un CDC sur une période de 30 jours, ce qui fait que toutes les plages ne sont pas forcement dessiné sur le CDC, car il existe des plages en dehors des 30 jours.

    Sur l'evenement ClicDown je fait un HitTest pour savoir sil la personne a cliqué sur le rectangle qui correspond a la plage. La méthode que j'utilise
    est la suivante :
    Pour i=1 a NbDePlage
    X et Y sont t'il sur la plage i ?
    Fin

    Ce qui fait que si j'ai 10 plages c'est extrement rapide, si j'en ai plus, on voit que sa patauge sévère.

    Quels méthode je pourais utilisé pour ne testé qu'un cours panel de plage plutot que toutes les plages ? Ou peut etre que j'ai oublier une fonctionnalité interne au C++ ou au CRectTracker ?

  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
    je suis etonné que ça prenne autant de temps que ça .
    combien de plage possibles ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    J'ai fait le bourin evidemment

    J'ai du mettre 100 Item et 100 plage par item, ce qui fait que le temps que le curseur change de forme il se passe un peu de temps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                L1 M2 M3 J4 V5 S6 D7
    Item 1    ----------       ---------
    Item 2  ------      ---------
    Donc y a pas de moyen de faire mieux, je pensait a un systeme classer des plages dans un differents tableaux.

    Exemple
    Tableau Des Plages Qui commencent Apres Janvier 2004
    Tableau Des Plages Qui commencent Apres Fevrier 2004
    Tableau Des Plages Qui commencent Apres Mars 2004


    Et le moment ou une personne clique sur un plage je regarde quel est le premier jours affiche mon CDC.

    Exemple 01/02/2004
    donc je parcourt uniquement les tableaux Fevier 2004 et Mars 2004 et pas tout ceux avant.

    Une idée dans ce genre n'est pas possible ?
    Parce que parcourir un tableau ligne à ligne, ca pas au top de l'optimisation

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Fais ça avec GDI + ça s'exécutera plus vite , non je plaisantais bien sûr

    Les solutions qu'on puisse apporter je pense c'est de réduire les plages sur quelques jours plutôt que 30 jours .
    Sinon au lieu de dessiner directos sur l'écran tout tracer à la place dans un CDC en mémoire puis faire un StretchBlt ou BitBlt à l'écran.
    Pour créer un CDC en mémoire c'est abordé dans la FAQ je crois.
    Je pense que c'est la meilleure solution.

    Sinon placer la séquence d'affichage dans un thread mais pas évident que cela soit plus performant

  5. #5
    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
    une piste peut etre pour accelerer .
    faire un vector trié des regions en coordonnées avec un indice correspondant au tableau .
    et une recherche en fonction d'un point de coordonnées ,une fois la zone trouvée on lit le tableau avec l'indice.
    ce qui veut que l'on remplit au debut le vector des differentes regions.
    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
     
    #include <vector> 
    #include <algorithm> 
    #include <iostream> 
    #include <string> 
    #include <set> 
     
    struct Plage
    {
    	Plage(CRect r,int n){RectPlage=r;nIndice=n;}
     
        CRect RectPlage; // le rectangle des  pour les <> plages
        int nIndice;     // l'indice dans le tableau CArray correspondant a la plage graphique
    };
     
    CPoint ptFind; // le point a rechercher issu du clic souris .
     
    // la fonction de recherche.
    bool InRegion(const Plage& rgn)
    {
      return (rgn.RectPlage.PtInRect(ptFind)?true:false);	
    }
    // foncteur servant à trier suivant les rectangles.
    struct SortByRect 
    { 
       bool operator ()(const Plage& p1, const Plage& p2) const 
       { 
          // trié suivant l'axe des x  a voir suivant les cas.
          return p1.RectPlage.left < p2.RectPlage.left; 
       } 
    }; 
     
       std::vector<Plage> v; // le tableau 
    // le remplissage au debut des plages graphiques avec correspondance de l'indice du CArray.
       v.push_back(Plage(CRect(20,20,30,30),1)); 
       v.push_back(Plage(CRect(10,10,15,15),0)); 
     
       // Tri  une fois .
       std::sort(v.begin(), v.end(), SortByRect()); 
     
     
    // la recherche de l'indice ...
       ptFind=CPoint(21,29); // le point a rechercher
       std::vector<Plage>::iterator p=std::find_if(v.begin(), v.end(), InRegion);
       TRACE("\n%d",p->nIndice);
    a voir ,tout dependra si le find_if est optmisé ou non .....

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    mat.M =>
    J'ai fait cela avec un cdc memoire je n'ai pas plus de probleme de "blink", c'est juste que le temps de parcourir le tableau on le voit vraiment.

    Exemple:

    Quand un personne clic sur une des plages je parcour le tableau complet pour dessiner la plage selectionnée d'une certaine manière (BLEU) et toute les autres d'une autre manière (GRIS).

    si je selectionne la première plage elle passe a la couleur bleu aussitot mais le temps que le curseur se transforme en croix ( méthode SETCURSOR) on patiente 4 sec. (c'est le temps de parcour du tableau)
    si je selectionne la dernière plage je patiente 4sec puis elle passe au bleu et j'ai le curseur en forme de croix.

    Donc mon probleme est de réduire le parcours à une portion : les plages affichées.

    => Farscape
    Je lis ton post avec attention en me tappant la tête contre le mur ^^
    Je vais le relire pour bien assimiler

  7. #7
    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
    ,le tri est a faire une seule fois evidemment ...

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Bon alors j'ai lu ton post avec attention mais ca m'embetait de devoir créer des zones ou Region.

    Comme je peux afficher sur mon planning du lundi 2 mars au 20 avril, ca aurait été plutot difficile a mettre en place.

    En fait j'ai trouvé une solution, lorsque je dessine les plages (une fonction TracePlage) je test si la plage est affiché ou non sur le cdc, et en fonction je remplie un tableau temporaire avec les indices de mon tableau général.

    en gros lorsque je test sur quelle plage on a cliqué je ne test plus sur mon tableau énorme, mais sur un tableau de 20à30 plages maximum.

    J'ai retrouvé la vitesse que je voulais, mais j'y ai perdu une fonctionnalité.
    avant je parcourait toutes les plages et si une plages n'etait pas sélectionné je m'etait un booleen a Faux.

    Vu que je ne parcours plus toutes les plages il fa falloir que je decrete qu'une selection de plage est perdu lorsqu'on se deplace dans le planning.

    Je garde ta solution sous le coude pour un autre probleme que je pourais avoir


    EDIT : bon j'ai trouver la solution pour les plages selectionnées qui ne sont pas affichées. Il suffit de les ajouter dans mon tableau temporaire

Discussions similaires

  1. Meilleure méthode pour tableau 2D
    Par gregcrv dans le forum Langage SQL
    Réponses: 4
    Dernier message: 14/06/2011, 18h27
  2. Meilleure méthode pour enregistrer un tableau 2D
    Par mathieu_t dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 12/09/2009, 19h54
  3. meilleur moyen pour parcourir un tableau
    Par deubelte dans le forum C++
    Réponses: 22
    Dernier message: 26/02/2007, 10h01
  4. Meilleur méthode pour stocker mes données
    Par cyberlewis dans le forum Windows
    Réponses: 6
    Dernier message: 03/07/2004, 11h53
  5. Réponses: 3
    Dernier message: 24/06/2004, 11h23

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