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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté 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
    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 Expert

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

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    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 expérimenté 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
    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
    Par défaut
    Salut,

    Peux-tu nous montrer ton évenement DrawITem ?

    a+

  5. #5
    Membre extrêmement actif
    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
    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.
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  6. #6
    Membre expérimenté 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
    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 extrêmement actif
    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
    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.
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

+ 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