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

Langage Delphi Discussion :

Mon appli plante le système totalement, comment est-ce possible


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut Mon appli plante le système totalement, comment est-ce possible
    Bonjour,

    Voilà un plantage qui ne m'est jamais arrivé. Mon application développée avec XE2 plante tout le système (WIN 7). Tout est figé (souris, clavier, écran) il faut forcer l'extinction du PC par le bouton de mise sous tension pour rebooter.
    Aucune information n'est présente dans l'observateur d'évènement de windows.

    Cela arrive lorsque je redimensionne une fenêtre dans laquelle se trouve une listbox dont j'utilise l'évènement OnDrawItem pour redessiner chaque ligne avec un dégradé de couleur. Le dégradé fait appel à des calculs flottants et utilisent les fonctions moveto et lineto pour dessiner les lignes.

    Si je supprime uniquement les calculs flottants: pas de plante.
    Si je supprime uniquement les fonction moveto et lineto : pas de plante.

    Comment est-il possible de planter le système à ce point ???
    Bug du compilateur ?

    Merci de votre aide.
    Franck

    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
     
     procedure GradHorizontal(Canvas:TCanvas; Rect:TRect; FromColor, ToColor:TColor) ;
     var
       X,deltaX  : integer;
       Re,dr,dg,db:real;
       C1,C2:TColor;
       r1,r2,g1,g2,b1,b2:Byte;
       R,G,B:Byte;
       cnt:integer;
     begin
       C1 := FromColor;
       R1 := GetRValue(C1) ;
       G1 := GetGValue(C1) ;
       B1 := GetBValue(C1) ;
     
       C2 := ToColor;
       R2 := GetRValue(C2) ;
       G2 := GetGValue(C2) ;
       B2 := GetBValue(C2) ;
     
     
       deltaX := Rect.Right-Rect.Left;
       if (deltaX<2) then exit;  // ==> EXIT HERE
       if (Rect.Bottom-Rect.top)<2 then exit; // ==> EXIT HERE
     
       dr := (R2-R1) / deltaX;
       dg := (G2-G1) / deltaX;
       db := (B2-B1) / deltaX;
     
       cnt := 0;
    //   for X := Rect.Left to Rect.Right-1  do
       for X := 0 to 190  do
       begin
         R := R1+Ceil(dr*cnt) ;
         G := G1+Ceil(dg*cnt) ;
         B := B1+Ceil(db*cnt) ;
     
         Canvas.Pen.Color := RGB(R,G,B) ;
     
         Canvas.MoveTo(X,Rect.Top) ;
         Canvas.LineTo(X,Rect.Bottom) ;
         inc(cnt) ;
       end;
     end;

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 291
    Points : 1 942
    Points
    1 942
    Par défaut
    La procédure de gradient en elle-même ne pose pas de problème (testé XE2 sous vista et seven).

    Il doit avoir un appel ailleurs qui fait que le dessin se fait en boucle,non?

  3. #3
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Ce qui est étrange c'est que j'ai détaché la fenêtre qui contient la liste dans une application de test qui ne contient que ça et là je n'ai pas rencontré de problème.
    Ce n'est qu'au sein de mon application qu'il y a un problème. Mon application n'utilise pas de thread. Il n'y a qu'un timer mais il n'y a aucune tâche qui s'execute au moment où je redimensionne la fenêtre et donc au moment du plantage.

    Ce que je n'arrive pas à comprendre c'est que ça puisse tout bloquer comme ça ! Il n'y a que les drivers qui peuvent bloquer un PC mais pas une application ?

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut,

    Peux-tu nous montrer ton évenement DrawITem ?

    a+

  5. #5
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Cela dépends aussi du matériel.

    Si ton processeur a 1 coeur, tu peux tout planter si le CPU monte à 100%.

    Si ton processeur a 2 coeurs ou plus, c'est déjà moins probable.

  6. #6
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Je suis sur un I7 à 4 coeurs.

    voici le code que j'ai épuré au max (j'ai remplacé les calculs flottant par des
    entier: idem).

    Ma listbox comporte 3 lignes avec itemHeigh = 51
    Lorsqu'il n'y a pas d'item selectionné, il n'y a pas de problème.
    Si je clique que l'item 1, et que je reduis la taille de la fenêtre du bas vers le haut, dès que le bord inférieur de la fênetre arrive sur l'item selectionné ça plante (mais pas forcément au premier coup).

    ==> en piece jointe l'image de la fenetre correspondant au code ci dessous.

    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
     
     //-----------------------------------------------------------------------------------------------------
     // Draw a Horizontal gradient (degrade)
     //-----------------------------------------------------------------------------------------------------
     procedure GradHorizontal(Canvas:TCanvas; Rect:TRect; FromColor, ToColor:TColor) ;
     var
       x,deltaX  : integer;
       dr,dg,db  : int64;
       r1,r2,g1,g2,b1,b2:Byte;
       R,G,B:Byte;
       cnt:integer;
     begin
       deltaX := Rect.Right-Rect.Left;
       if (deltaX<2) then exit;
       if (Rect.Bottom-Rect.top)<2 then exit;
     
       R1 := GetRValue(FromColor) ;
       G1 := GetGValue(FromColor) ;
       B1 := GetBValue(FromColor) ;
     
       R2 := GetRValue(ToColor) ;
       G2 := GetGValue(ToColor) ;
       B2 := GetBValue(ToColor) ;
     
       dr := (R2-R1);
       dg := (G2-G1);
       db := (B2-B1);
     
       cnt := 0;
       for X := Rect.Left to Rect.Right  do
       begin
         R := R1 + ((dr * cnt) div deltaX);
         G := G1 + ((dg * cnt) div deltaX);
         B := B1 + ((db * cnt) div deltaX);
     
         Canvas.Pen.Color := RGB(R,G,B) ;
     
         Canvas.MoveTo(X,Rect.Top) ;
         Canvas.LineTo(X,Rect.Bottom) ;
         inc(cnt) ;
       end;
     end;
     
     //-----------------------------------------------------------------------------------------------------
     procedure LB_DrawItem(LB:TListBox;Index: Integer;Rect: TRect; State: TOwnerDrawState);
    begin
        // Selected line
        if (odSelected in state)then
        begin
          Gradhorizontal(Lb.Canvas,rect,$00906040,clwhite); // ==> NON ! PLANTE du système
        end else
        // Not selected line
        Begin
          Gradhorizontal(Lb.Canvas,rect,RGB(203,225,252),RGB(125,165,224));
        End;
    end;
    Images attachées Images attachées  

  7. #7
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Est ce que tu peux faire ce test :

    1 - Commente toutes les lignes de la boucle.

    Si le programme ne plante plus :

    dé-commente une à une les lignes de la boucle pour tomber sur la ou les lignes qui pose problème.

  8. #8
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    j'avais déjà fait ce test.
    Lorsque je commente uniquement les 3 lignes du calcul de R,G,B ça ne plante pas.
    Lorsque je commente uniquement les 2 lignes moveto et lineto, ça ne plante pas.

    Je veux bien refaire les tests mais c'est très long car il faut rebooter le PC à chaque fois en faisant un arrêt hardware forcé.

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 787
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 787
    Points : 13 440
    Points
    13 440
    Par défaut
    Il y a l'API GradientFill pour éviter de se taper les calculs

    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
    procedure GradHorizontal(aCanvas :TCanvas; aRect :TRect; aFromColor, aToColor :TColor);
    var
      Vertex :array[0..1] of TTriVertex;
      GRect  :TGradientRect;
     
    begin
      Vertex[0].x      := aRect.Left;
      Vertex[0].y      := aRect.Top;
      Vertex[0].Red    := GetRValue(aFromColor) shl 8;
      Vertex[0].Green  := GetGValue(aFromColor) shl 8;
      Vertex[0].Blue   := GetBValue(aFromColor) shl 8;
      Vertex[0].Alpha  := $FF00;
     
      Vertex[1].x      := aRect.Right;
      Vertex[1].y      := aRect.Bottom;
      Vertex[1].Red    := GetRValue(aToColor) shl 8;
      Vertex[1].Green  := GetGValue(aToColor) shl 8;
      Vertex[1].Blue   := GetBValue(aToColor) shl 8;
      Vertex[1].Alpha  := $FF00;
     
      GRect.UpperLeft  := 0;
      GRect.LowerRight := 1;
     
      GradientFill(aCanvas.Handle, @Vertex, 2, @GRect, 1, GRADIENT_FILL_RECT_H);
    end;

  10. #10
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    J'arrive à reproduire le problème dans une application de test.

    je vous la joins, merci de me dire si vous avez aussi le problème en mode debug.

    Il faut selectionner la première ligne et reduire la taille verticale de la fenêtre.
    Fichiers attachés Fichiers attachés

  11. #11
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    humm...

    ça voudrais dire qu'à un moment, tu ne peux plus dessiner la ligne...

    et donc que Canvas.Pen.Color n'est plus bon ?

    as tu vérifier que tes couleurs RGB était bonne ?

    Comme c'est des Bytes... je ne sais pas si ça peux dépasser...

    Peux tu avoir un affichage des valeurs de RGB au moment ou ça plante ?

  12. #12
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    MERCI Andnotor, je ne connaissais pas cette fonction.

    je viens de l'essayer et CA MARCHE !

    Mais ça n'explique pas pourquoi ma fonction plantait !!!!

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 787
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 787
    Points : 13 440
    Points
    13 440
    Par défaut
    Je me demande dans quelle mesure avec ton code tu n'essayais pas d'affecter des valeurs négatives à R, G et B...

    ?

  14. #14
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Même si c'était le cas je ne vois pas pourquoi ça ferait planter tout le système.
    Et puis -1 sur un byte ça fait 255 et ça ne génère pas d'exception.
    Non, je ne comprends vraiment pas et ça me gène beaucoup même si j'arrive à le contourner avec cette fonction de l'API.

  15. #15
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    J'ai un autre problème lorsque je redimenssionne la fenêtre en largeur.
    Il n'y a QUE la partie agrandie qui est redessinée ce qui ne va pas dans le cas où l'on dessine un gradient car il faudrait que toute la largeur de la fenêtre soit redessinée à chaque fois.
    J'ai testé le paramêtre "rect" qui est passé à l'évènement OnDrawItem, les valeurs left et top sont bien respectivement 0,0 et right varie bien avec l'élargissement de la fenêtre.
    idem pour la propriété ClipRect de la listbox.
    Comment forcer le redessin totale de toute la largeur ?

  16. #16
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Je vais répondre à ma dernière question:
    Dans le OnResize de la fenêtre il faut écrire:
    repaint;

  17. #17
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 787
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 787
    Points : 13 440
    Points
    13 440
    Par défaut
    Citation Envoyé par franckcl Voir le message
    Et puis -1 sur un byte ça fait 255 et ça ne génère pas d'exception.
    Assigner -1 à une variable de type byte ne compile pas à moins d'un transtypage v := byte(-1). Cela devrait être un ShortInt.

    Au runtime, décrémenter un byte lui fera bien faire le tour pour autant que la Vérification des limites soit désactivée {$R-} (Je te rassure, elle l'est par défaut ), sinon ERangeError.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/11/2012, 21h39
  2. HashMap en multi-thread et NullPointerException ; comment est-ce possible ?
    Par sami44 dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 09/01/2008, 15h43
  3. Negociation, comment est ce possible?
    Par Jim_Nastiq dans le forum Paie
    Réponses: 11
    Dernier message: 31/07/2007, 16h03
  4. Comment est-ce possible ?
    Par Jibees dans le forum C
    Réponses: 25
    Dernier message: 05/09/2006, 11h08

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