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

GTK+ avec C & C++ Discussion :

Image de fond dans CSS => fuite de mémoire


Sujet :

GTK+ avec C & C++

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut Image de fond dans CSS => fuite de mémoire
    Bonjour

    J'avais un programme qui tournait bien. J'ai une fuite de mémoire et je ne sais où chercher !

    Le code du programme si vous voulez regarder est là : http://troumad.org/Mes_regles/perso3psi.zip mais, il y a plus de 20 000 lignes...

    Donc, j'explique :
    Dans le main.c j'ouvre une petite fenêtre de dialogue. Avant l'ouverture de ma fenêtre, je mets en place toute ma base de données.

    Le problème, c'est que lorsque je reste sur cette fenêtre, j'ai assez de fuite de mémoire pour utiliser 100% de la mémoire de mon PC !

    Après l'ouverture de cette fenêtre, il y a certes beaucoup de chose qui se passent (ouverture de fenêtre, parcours très fréquents des différentes états pour vérifier que tout est en état. Mais, ces autres fenêtres n'étant pas ouvertes, les processus qu'elles génèrent ne peuvent pas commencer.

    Si je laisse inactive la fenêtre, la mémoire ne se remplit pas. Je pense donc que c'est dans la fenêtre en question.

    Je fais des essais, quand j'enlève tous les boutons, je n'aéi plus ce problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
      g_signal_connect (button, "clicked", G_CALLBACK (cb_fin),(gpointer)  param);
      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
    Si je les mets et que je ne passe pas la souris dessus, c'est bon (mais sans utiliser les boutons, le programme perd de son intérêt !)

    Je commente la ligne avec g_signal_connect, le problème reste le même

    Donc, je bloque...
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Tu as constaté les fuites sous Linux ou Windows ? Quelle version de GTK+ ?
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Sous Linux avec lib64gtk+3.0-devel 3.6.2-4.mga3 et 3.4.1-2.mga2 (mageia 3 et mageia 2).
    Je n'ai pas testé avec Windows, je pourrais le faire si besoin.

    J'ai fait les tests poussé avec lib64gtk+3.0-devel 3.6.2-4.mga3 .
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Pas besoin de tester avec Windows, c'est juste que GTK 2 sous Windows avait de grosses fuites mémoire qui n'ont été corrigées qu'avec une des dernières versions de GTK 2.24. Sous Linux, pour détecter des fuites mémoires, tu peux utiliser Valgrind. Tu as un lien sur le wiki GNOME pour utiliser Valgrind avec GTK. Tu as besoin d'un fichier de suppression (qui doit être dispo sur cette page là) pour éviter les faux positifs (fuites signalées qui n'en sont pas), et en quitant le programme, il te dit où se trouvent les fuites. Tu peux aussi utiliser le module Massif de Valgrind qui trace une courbe de la consommation mémoire et voir quand elle augmente et quand elle devrait diminuer mais ne le fait pas.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Je ne sais pas si je vais utiliser Valgrind car j'ai une information à te donner avant : pas de problème avec mon gtk3 sous windows !

    J'ai quand même testé... Ça ralentit beaucoup le système. On ne voit rien avant d'arrêter. Lors de l'arrêt j'ai eu un défilement d'info sur l'écran impressionnant :
    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
    ==566== 22,656 bytes in 364 blocks are possibly lost in loss record 7,207 of 7,283
    ==566==    at 0x4C28B0C: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==566==    by 0x4C28C80: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==566==    by 0x6B423AE: g_realloc (in /usr/lib64/libglib-2.0.so.0.3400.3)
    ==566==    by 0x6B5AE56: ??? (in /usr/lib64/libglib-2.0.so.0.3400.3)
    ==566==    by 0x6B5AEA9: g_string_sized_new (in /usr/lib64/libglib-2.0.so.0.3400.3)
    ==566==    by 0x6B3E8DC: ??? (in /usr/lib64/libglib-2.0.so.0.3400.3)
    ==566==    by 0x6B406CA: g_markup_parse_context_parse (in /usr/lib64/libglib-2.0.so.0.3400.3)
    ==566==    by 0x461C53: g_markup_dom_new (xml.c:456)
    ==566==    by 0x42CD32: retourne_sort (feuille.c:2295)
    ==566==    by 0x447770: main (main.c:445)
    ==566== 
    ==566== 23,712 bytes in 1 blocks are still reachable in loss record 7,208 of 7,283
    ==566==    at 0x4C28B0C: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==566==    by 0xA49448F: ft_mem_qalloc (in /usr/lib64/libfreetype.so.6.10.0)
    ==566==    by 0xA4944E2: ft_mem_alloc (in /usr/lib64/libfreetype.so.6.10.0)
    ==566==    by 0xA494971: ft_mem_qrealloc (in /usr/lib64/libfreetype.so.6.10.0)
    ==566==    by 0xA4949EA: ft_mem_realloc (in /usr/lib64/libfreetype.so.6.10.0)
    ==566==    by 0xA4C9823: ??? (in /usr/lib64/libfreetype.so.6.10.0)
    ==566==    by 0xA4CBF04: ??? (in /usr/lib64/libfreetype.so.6.10.0)
    ==566==    by 0xA4A52FB: ??? (in /usr/lib64/libfreetype.so.6.10.0)
    ==566==    by 0xA495ED0: ??? (in /usr/lib64/libfreetype.so.6.10.0)
    ==566==    by 0xA4986D9: FT_Open_Face (in /usr/lib64/libfreetype.so.6.10.0)
    ==566==    by 0xA4996CA: FT_New_Face (in /usr/lib64/libfreetype.so.6.10.0)
    ==566==    by 0x664F9EC: ??? (in /usr/lib64/libcairo.so.2.11200.12)
    ==566== 
    ==566== 24,621 bytes in 1,274 blocks are still reachable in loss record 7,209 of 7,283
    ==566==    at 0x4C28B0C: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==566==    by 0x6B42310: g_malloc (in /usr/lib64/libglib-2.0.so.0.3400.3)
    ==566==    by 0x6B58B3B: g_strdup (in /usr/lib64/libglib-2.0.so.0.3400.3)
    ==566==    by 0x42EAB2: lire_struct_sort (feuille.c:2713)
    ==566==    by 0x4472B3: main (main.c:395)
    ==566==
    En passant à des endroits où je ne vois pas pourquoi il passe par là... feuille.c par exemple !

    Mais, ces erreurs, il les faits même lorsque je l'arrête de suite sans passer par les boutons !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Je vois une possibilité d"erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ==3373==    by 0x461C08: g_markup_dom_new (xml.c:448)
    ==3373==    by 0x426DF4: retourne_classe (feuille.c:1355)
    Pour la première, il n'y a pas
    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
      {
        gchar *text = NULL,*ch,*point=NULL;
        gsize length = -1;
     
        for (ch=(gchar *)filename;*ch!=0;ch++)
        {
            if (*ch==SEPARATEUR || *ch=='\\') point=NULL;
            else if (*ch=='.') point=ch;
        }
     
        if (ch-point==4 && strncmp(point,".od",3)==0 && (point[3]=='t' || point[3]=='c' || point[3]=='p' || point[3]=='s') )
        {
            text=content_libo((char *)filename,&length);
        }
        else
            g_file_get_contents (filename, &text, &length, error);
    Et pour la seconde, il y a :
    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
    void retourne_classe(struct_classe * classe_, char * fichier, gpointer param)
    {
        GMarkupDomNode * node=NULL,* ooo=NULL;
        char * tmp, *tmp1;
     
        if (classe_->add1.nom!=NULL)
        {
            free(classe_->add1.nom);
            classe_->add1.nom=NULL;
        }
        if (classe_->add2.nom!=NULL)
        {
            free(classe_->add2.nom);
            classe_->add2.nom=NULL;
        }
     
        if ((ooo = g_markup_dom_new (fichier, NULL)))
    Dans les deux cas, ce ne sont pas des erreurs car j'initialise des pointeurs ! Il faut mettre quelles précaution dans le code ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Pour info, vu comment je te vois gérer les noms de fichiers, regarde la doc de g_build_path, g_build_filename, g_path_*. Et pour la gestion portable des séparateurs de dossiers, G_DIR_SEPARATOR et G_IS_DIR_SEPARATOR.

    Idem pour la comparaison d'extension de fichiers, c'est le genre de choses à ne pas réimplémenter soi même. g_str_has_suffix sera sans doute un peu moins performant, mais plus lisible. Je n'ai pas trouvé de fonction GLib qui extraie directement l'extension d'un fichier, mais ça peut se refaire avec g_strrstr en recherchant le point (même si je ne sait pas si c'est assez robuste pour tous les cas de figure...).

    Sorti de ça, ton code est assez dur à lire, peu commenté, et de toute façon quand j'ai vu des passages avec des pointeurs et 5 niveaux d'indirection (GtkWidget *****), j'ai lâché l'affaire... Désolé.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  8. #8
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Il va falloir que je regarde ici aussi tes conseils.

    Mais, je viens de réparer mon problème de fuite de méoire en changeant le thème graphique de xfce4 : http://www.mageialinux-online.org/forum/topic-14765.php

    nb : conseils suivit et j'ai perdu des lignes de codes
    Tu n'as pas vu tout mon code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep --color -r "\*\*\*\*\*\*"  * 2>/dev/null
    montre des pointeurs à 6 niveaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((GtkWidget ******)param)[M_PSI][i][j][k][1]
    par exemple

    Ne n'ose mettre résolu car personne d'autre n'aurait relayer ce problème... Peut-être un petit bug de mon programme. À voir...
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    J'ai réduit le code au maximum pour voir d'où vient l'erreur.

    C'est la présence de l'image de font dans le css qui fait tout planter avec le thème gtk-oxygène.

    Voici le programme :
    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
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <errno.h>
     
    int main (int argc, char *argv[])
    {
      GtkWidget *button = NULL;
      GtkWidget *win = NULL;
      GtkWidget *vbox = NULL;
     
      GError * error=NULL; GdkDisplay *display;
      GdkScreen *screen;
      GtkCssProvider * css_provider;
     
      /* Initialize GTK+ */
      g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
      gtk_init (&argc, &argv);
      g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
     
      /* Create the main window */
      win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_container_set_border_width (GTK_CONTAINER (win), 8);
      gtk_window_set_title (GTK_WINDOW (win), "Hello World");
      gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
      gtk_widget_realize (win);
      g_signal_connect (win, "destroy", gtk_main_quit, NULL);
     
      /* Create a vertical box with buttons */
      vbox =  gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
      gtk_container_add (GTK_CONTAINER (win), vbox);
     
      button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
      g_signal_connect (button, "clicked", gtk_main_quit, NULL);
      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
     
        display = gdk_display_get_default ();
        screen = gdk_display_get_default_screen (display);
        css_provider = gtk_css_provider_get_default ();
        gtk_css_provider_load_from_path (css_provider,"mongtk.css",NULL);
        if (error!=NULL)
        {
           g_printerr ("Unable to read file: %s\n", error->message);
           g_error_free(error);
        }
        gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (css_provider),GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
        g_object_unref (css_provider);
     
      /* Enter the main loop */
      gtk_widget_show_all (win);
      gtk_main ();
      return 0;
    }
    avec le fichier css :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GtkWindow {
        background-image : url("images/dragon.jpg");
    }
    Remarque : l'image a du mal à s'afficher chez moi. Souvent, j'ai n'importe quoi à ce niveau
    Sauf sous windows avec gtk 3.6.4.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  10. #10
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Voici un résumé de l'état du problème :

    Le fichier minimal qui le génère : http://troumad.org/OOo/test_oxygen.zip
    Une fenêtre avec un bouton et mon css. Je ne suis pas le seul à avoir ce problème visiblement.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

Discussions similaires

  1. [2.x] Images de fond dans le css du template de base
    Par y0ussef dans le forum Symfony
    Réponses: 5
    Dernier message: 17/05/2012, 16h56
  2. Image de fond dans un css
    Par Blaede dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 06/05/2008, 19h51
  3. placer une image de fond dans un script css
    Par AnDy(yours) dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 31/05/2007, 13h10
  4. [CSS] Image de fond dans un élément <div>
    Par Yogui dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 16/05/2006, 13h05
  5. [CSS] Redimensionner l'image de fond dans un champ input
    Par choubiroute dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 19/01/2006, 10h25

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