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 :

probleme de mémoire?


Sujet :

GTK+ avec C & C++

  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut probleme de mémoire?
    bonjour, voila j'ai un problème avec une de mes fonctions
    j'ai un programme composé d'une fenêtre avec une liste, lorsque l'on clique sur une des lignes de la liste, une nouvelle fenêtre s'ouvre.
    voila le problème c'est que si l'on ouvre et ferme la nouvelle fenêtre trois fois de suite, le programme plante

    code de ma fonction
    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
    57
     
    static void
    AffichageConversation(gchar *sPath, gint iPath){
      GtkWidget *pWindow;
      GtkWidget *pVBox;
      GtkWidget *pTextView;
      GtkWidget *pScrolled;
      GtkWidget *pLabel;
      GtkTextBuffer *pText;
      gint r;
     
      pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_window_set_default_size(GTK_WINDOW(pWindow), 480, 480);
      gtk_window_set_title(GTK_WINDOW(pWindow), "Conversation");
      g_signal_connect(G_OBJECT(pWindow), "delete-event", G_CALLBACK(quit), NULL);
     
      if((r = open(sPath, O_RDONLY)) == -1){
        pLabel=gtk_label_new("Erreur lors de l'ouverture de la converation");
        gtk_container_add(GTK_CONTAINER(pWindow), pLabel);
        gtk_widget_show_all(pWindow);
        return;
      }
     
      pVBox = gtk_vbox_new(FALSE, 5);
      gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
     
      //Creation de la barre d'outils
      static GtkWidget *pToolbar = NULL;
      pToolbar = gtk_toolbar_new();
      gtk_box_pack_start(GTK_BOX(pVBox), pToolbar, FALSE, FALSE, 0);
      //Creation a partir de stock
      gtk_toolbar_insert_stock(GTK_TOOLBAR(pToolbar), GTK_STOCK_SAVE, "Enregistrer", NULL, NULL, NULL, -1);
      gtk_toolbar_insert_stock(GTK_TOOLBAR(pToolbar), GTK_STOCK_QUIT, "Fermer", NULL, G_CALLBACK(quit), NULL, -1);
      gtk_toolbar_append_space(GTK_TOOLBAR(pToolbar));
      gtk_toolbar_insert_stock(GTK_TOOLBAR(pToolbar), GTK_STOCK_GO_BACK, "Precedent", NULL, NULL, NULL, -1);
      gtk_toolbar_insert_stock(GTK_TOOLBAR(pToolbar), GTK_STOCK_GO_FORWARD, "Suivant", NULL, NULL, NULL, -1);
      //Insertion d'un espace
      gtk_toolbar_append_space(GTK_TOOLBAR(pToolbar));
      //Modification de la taille des icones
      gtk_toolbar_set_icon_size(GTK_TOOLBAR(pToolbar), GTK_ICON_SIZE_BUTTON);
      //Affichage uniquement des icones
      gtk_toolbar_set_style(GTK_TOOLBAR(pToolbar), GTK_TOOLBAR_ICONS);
     
      pScrolled = gtk_scrolled_window_new(NULL, NULL);
      gtk_box_pack_start(GTK_BOX(pVBox), pScrolled, TRUE, TRUE, 5);
      pTextView = gtk_text_view_new();
      gtk_text_view_set_editable(GTK_TEXT_VIEW(pTextView), FALSE);
      gtk_container_add(GTK_CONTAINER(pScrolled), pTextView); //BUGGGGGGGGGGGGGGGGGGGGG
      gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pScrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
      pText = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pTextView));
      //création de tags pour afficher le texte en gras ou couleur
      gtk_text_buffer_create_tag(pText, "message", "weight", PANGO_WEIGHT_BOLD, "foreground", "blue", NULL);
      gtk_text_buffer_create_tag(pText, "arrive", "weight", PANGO_WEIGHT_BOLD, "foreground", "red", NULL);
     
      gtk_widget_show_all(pWindow);
      return;
    }
    merci de votre aide

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Salut,

    J'ai pu remarquer une erreur dans le code ... ou quelques chose de mal fait, c'est d'ailleur justement où se trouve ton bug:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_container_add(GTK_CONTAINER(pScrolled), pTextView); //BUGGGGGGGGGGGGGGGGGGGGG
    Pour ajouter un widget enfant dans un GtkScrolledWindows, il faut utiliser la fonction: gtk_scrolled_window_add_with_viewport
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    j'ai changer la ligne, j'ai mis ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(pScrolled), pTextView);
    mais j'ai toujours le même probleme, au bout de la 2eme fois qu'on ouvre une fenetre le programme se bloque..

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    je sais pas trop si ca a un lien mais:
    en cherchant j'ai trouvé qu'il fallait utilisé la fontion gtk_widget_destroy pour fermer la deuxieme fentre
    voila le code que j'ai essayé (sans résultat), lors de la déclaration de la deuxieme fenetre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(quit), NULL);
    et une fonction quit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    static void
    quit(GtkWidget *pWidget){
      gtk_widget_destroy(pWidget);
    }
    seulement j'ai remarqué que mon bouton quitter qui se trouve dans la barre d'outils et qui fait appel a la fonction quit ne marche pas, quand je clique dessus, il disparait...

    merci de votre aide

  5. #5
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    je sais pas si ca a un lien, mais je viens de me rendre compte que pour creer ma liste de ma premire fenetre je creai une vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_scrolled_window_new(NULL, NULL);
    or dans mon buffer de ma deuxieme fenetre, j'utilise la même fonction
    est-ce que ca peut avoir un lien a votre avis???

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bon a moins que je vois pas bien ... il se fait un peu tard est l'apéro etait un peu long mais ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if((r = open(sPath, O_RDONLY)) == -1){
        pLabel=gtk_label_new("Erreur lors de l'ouverture de la converation");
        gtk_container_add(GTK_CONTAINER(pWindow), pLabel);
        gtk_widget_show_all(pWindow);
        return;
      }
    Ok mais avant la fin de ta fonction, a la fermeture de ta fenetre, c'est fait expret que tu ne ferme pas ce que tu ouvres ou bien est-ce un oubli ... cela pourrais être une tres grosse source d'erreur je pense !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    bonjour!
    je vois pas ou est mon erreur? quand tu dis que je ferme pas ce que j'ouvre?
    si tu parles de la fenetre, elle est associé à un appel qui la ferme "propremment" (lors de sa déclaration)
    merci de ton aide

  8. #8
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Il parle du descripteur de fichier r que tu utilises pour ouvrir un fichier mais que tu ne refermes pas...

    J'ai testé ton code en enlever cette ouverture de fichier et je peux facilement ouvrir 5 fenêtre conversation sans problème.

    De toute façon tu as un problème de conception puisqu'il va falloir que tu libères la mémoire. Cela se fait peut-être dans ta fonction quit que tu n'as pas fourni. Je pense que tu as plutôt un problème à un autre niveau.

    Essaye de faire comme moi: a chaque click dans ta liste, ouvre simplement ta fenêtre conversation sans rien dedans (en enlevant donc l'ouverture du fichier) et occupe toi de bien libérer la mémoire... A part cela, avec ma version de gtk, ton code ne pose pas de problème...

    Jc

  9. #9
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    effectivement, j'ai pas fermer le fichier, je vais le faire (d'ailleurs, comment je dois faire?)
    sinon moi aussi quand j'ouvre juste une fenetre sans rien dedans, ca marche, c'est dés que j'essaye d'y inclure mon texte buffer que ca casse
    par contre si j'y mets un simple label ca passe
    je te copis ma fonction quit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    static void
    quit(GtkWidget* pWidget, gpointer pData){
      gtk_widget_destroy(GTK_WIDGET(pData));
    }
    à priori elle marche bien

    merci de me venir en aide en tout cas

    dernière petite précison, on m'a conseillé d'installer le logiciel valgring pour débloqué tout ca, et d'ici lundi ca devrai etre opérationnel

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Hum m'est d'avis que pour l'ouverture et la fermeture de descripteur de fichiers .... etant donné que tu code avec GTK, le mieux serais d'utiliser les fonctions de la GLib pour une meilleure portabilité, il se trouve qu'il existe justement des wrappers de fonctions POSIX pour la gestion de fichiers: File Utilities et au pire, utilise les fonctions standard (ANSI) du C (fopen, fclose, ....)
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par CSoldier
    au pire, utilise les fonctions standard (ANSI) du C (fopen, fclose, ....)
    Tu veux dire 'au mieux' !

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par CSoldier
    au pire, utilise les fonctions standard (ANSI) du C (fopen, fclose, ....)
    Tu veux dire 'au mieux' !
    me suis fait eu Oui biensur au mieux, me suis mal exprimé
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  13. #13
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    c'est bon le fichier est fermé, mais de toute facon comme il était dans un if, et que "normalement" ce if ne s'execute pas, c'était pas ca la cause de mon probleme

Discussions similaires

  1. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  2. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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