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

Composants VCL Delphi Discussion :

Grille OnDrawCell CPU 100%


Sujet :

Composants VCL Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 212
    Par défaut Grille OnDrawCell CPU 100%
    Voilà la situation :
    - j'ai dans mon programme 2 grilles. Une est invisible pour l'utilisateur et l'autre, visible, doit se mettre à jour en permanence en fonction du contenu de la première. La mise à jour consiste en différentes concaténations et opérations 'visuelles' (alignement à droite/gauche, mise en gras de certaines cases, etc...)

    La mise à jour de la deuxième grille se fait via OnDrawCell.

    Le problème : dès que la OnDrawCell se lance, la charge CPU du micro passe à 100% (visible dans le gestionnaire des taches Windows).

    La question : est-il possible de ne lancer OnDrawCell qu'à un certain moment (qd la 1ere grille est modifiée) et de la bloquer à d'autres moments? ou existe-t-il une solution pour limiter l'accaparement des ressources CPU par mon programme ???

    Pour info, la méthode que j'utilise actuellement est la suivante :
    - OnDrawCell ne peut se lancer que si le tag de la première grille est supérieur à une certaine valeur (il augmente/diminue en fonction du contenu). Le tag est remis à zéro régulièrement par un timer. a fonctionne plutôt mal (certaines mises à jour n'apparaissent qu'à lamise à jour suivante, certaines opération ne sont pas faites, etc...). En plus, c'est pas propre

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Si comme je l'ai compris c'est toi qui déclenche l'événement "ondrawcell", tu pourrais gagner du temps en ne tracant que les cellules visibles :
    Pour cela, on peut tester si la fonction CellRect retourne nil (Cell non visible).

    Autre suggestion : ne pas retracer si la valeur des cells est inchangée.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 212
    Par défaut
    Merci Graphito pour ta réponse, mais tout se passe exactement comme si le OnDrawCell était appelé de façon continu. Or aucune procédure ne fait de Refresh, Repaint ou Invalidate sauf les évènements qui ajoute/retire des infos dans la grille de référence (la première)

    Je continue à chercher, mais là, je sèche de + en +

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 212
    Par défaut
    UP

  5. #5
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Bonjour

    Le OnDrawCell est normalement appelé seulement quand il faut. Je ne crois même pas qu'il dépend des données à l'interieur de la cellule.

    Si ta grille dépasse la dim. de la fenetre, et que tu modifies une donnée non visible dans ta grille, OnDrawCell ne sera pas appelé...

    A vérifier: le simple fait de passer une fenetre autre par dessus ta grille, re-appelera ton evt OnDrawCell, là ou il faut.

    Donc en fait le probleme se situe autre part.
    Ta grille invisible, est-ce qu'elle est superposée à ta grille visible ?
    il pourrait y avoir un genre de récursivité
    Je dessine ma cellule
    Je met à jour un truc qui passe brievement devant ma cellule
    Donc je dois redessiner ma cellule, ainsi de suite...

    Est-ce que le traitement dessin de onDrawCell est lourd ?
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 212
    Par défaut
    TicTacToe :
    Ma deuxième grille est dans une form qui n'est jamais affichée à l'écran (sauf si un paramètre est passé en ligne de commande pour le débuggage, et encore... ce paramètre rend simplement actif et visible un bouton qui permet d'afficher cette form)

    Autrement, voici ma procédure OnDrawCell :
    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
     
     
    procedure TForm1.AdvStringGrid3DrawCell(Sender: TObject; ACol,
      ARow: Integer; Rect: TRect; State: TGridDrawState);
    var
       i : integer;
       s,tmp : string;
       ht,v : extended;
    begin
      // - dimensionnement de la dernière ligne à 0 pt de hauteur 
     for i:=1 to advstringgrid3.rowcount-2 do advstringgrid3.RowHeights[i]:=21;
     advstringgrid3.RowHeights[advstringgrid3.RowCount-1]:=0;
     
      // - dimensionnement de la 1ere colonne si ascenceur (largeur ascenceur [scrollwidht=17])
     if advstringgrid3.RowCount>19 then advstringgrid3.ColWidths[0]:= 612
       else advstringgrid3.ColWidths[0]:= 629;
     
     // centrage à droite de la dernière colonne
      If ((acol=3)and(arow>0)) then
      begin
       With Sender As TStringGrid Do With Canvas Do
       Begin
        { Sélection de la couleur de fond }
        If not(gdFixed in State)
          Then If gdSelected In State
            Then Brush.Color := $00EACAB6
            Else Brush.Color := clWhite;
        { Dessin du fond }
        FillRect(Rect);
        { Dessin du texte en utilisant la fonction API }
        DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]), -1, Rect ,
                  DT_RIGHT or DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE  );
       End;
      end;
     
       // -------------------------------------------------------
       // -  opérations relatives aux opérations sur les chaines de caractères
       // -  déplacée dans une fonction à part qui met à jour les deux grilles 
       // -  en même temps (grille détail et grille visible)
       // -------------------------------------------------------
       form1.toolbutton3.enabled:=true;
     
     
       ht:=0;
       for i:=1 to advstringgrid3.RowCount-1 do
       if ((form1.advstringgrid3.cells[3,i]<>'')and(form1.advstringgrid3.cells[3,i]<>'Offert')) then
         begin
           v:=0;
           try
             v:= strtofloat(advstringgrid3.Cells[3,i]);
           Finally
             ht:=ht+v;
           end;
         end;
       edit7.Text:=floattostrf(ht,ffFixed,18,2);
    end;
    Comme on peut le voir, toute la partie du programme qui s'occupait de la concaténation des chaînes de caractères a été déplacée vers une fonction à part (qui n'est appelée que lorsque qu'on fait la mise à jour de la grille 'détail' (celle qui est invisible)).

    Pour info, il s'agit de réaliser une petite application pour me silmplifier l'élaboration et la rédaction de mes devis (plomberie, électricité, chauffage, géothermie, solaire). La grille 'détail' contient tout les renseignements sur chaque composant que j'ajoute dans mon devis, la grille 'visible' se contentant d'afficher ce qui est le texte du devis --> Descriptif, PU, Qté, PV). Le prix HT est recalculé en focntion du contenu de cette grille.

    Si j'avais à dispo un OnChange, je pense que cela me simplifierait la vie, mais bon, tout le monde l'aura deviné, en programmation je ne suis qu'un dilettante autodidacte...

  7. #7
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Comme je crains que les redimensionnements générent des drawcell en cascade, tu pourrais essayer :
    - de tester les rowheigths afin de ne les modifier que si elles ont changé,
    - idem pour les ColWidths.

  8. #8
    Membre Expert
    Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    normalement sa doit planté votre poste
    comme a dit Graffito déplasse les redimantion l'ecriture dans edit extérirur de drawcell
    normalement en socupe dans drawcell que de la cellule qui a les cordonné acol et arow
    bon div (pas dev)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 212
    Par défaut
    Merci Graffito. Il semblerait que c'était effectivement un problème d'appel en cascade. Je testes et cela fonctionne bcp mieux...

    Edam :

    - Non, ça ne plante pas la bécane, mais ça la ralenti sérieux (pour info, je tournes sous XPsp2)
    - Par contre, je ne comprends pas trop quand tu dis que je dois déplacer mon redimensionnement dans l'édit extérieur de DrawCell... tu entends quoi par 'edit extérieur' ? Je n'ai pas de OnEdit, par contre j'ai une procédure OnEditingDone. Est-ce de cette procédure dont tu veux parler ?

  10. #10
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    +1



    donc c'était bien un probleme de 'redessine moi' récursif

    non pas généré par quelque chose qui passe devant, mais par un redimensionnement

    On y arrive petit à petit

    bon courage A+
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  11. #11
    Membre Expert
    Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    Citation Envoyé par edam
    normalement sa doit planté votre poste
    comme a dit Graffito déplasse les redimantion l'ecriture dans edit extérirur de drawcell

    je veux dire : les redimantion et l'ecriture dans edit à l'extérirur de drawcell

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 212
    Par défaut
    Merci à tous pour vos réponses. C'est agréable de voir que sur ce site, on accepte de vous aider, même (et surtout) si vous n'êtes pas un pro.

    Longue vie à developpez.com et à tous ceux qui le font vivre

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

Discussions similaires

  1. [SQL2K]CPU à 100%
    Par Overkill06 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 09/01/2007, 16h50
  2. Consomation CPU 100%
    Par Ines102006 dans le forum Oracle
    Réponses: 10
    Dernier message: 27/12/2006, 17h55
  3. [Hardware]PC s'éteint tout seul quand CPU 100%
    Par gojira dans le forum Composants
    Réponses: 18
    Dernier message: 03/08/2006, 10h49
  4. [Eclipse 3.1 et WTP 0.7M5] Utilisation du CPU à 100%
    Par stanislas dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 09/07/2005, 23h21
  5. [WSAD] pb de lenteur et CPU à 100%
    Par triphop17 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 27/10/2004, 14h05

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