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 :

(perso:3121): Gtk-CRITICAL **: IA__gtk_style_detach: assertion `style->attach_count > 0' failed


Sujet :

GTK+ avec C & C++

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    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 602
    Points : 7 837
    Points
    7 837
    Par défaut (perso:3121): Gtk-CRITICAL **: IA__gtk_style_detach: assertion `style->attach_count > 0' failed
    Bonjour

    Je compile sous code::block en mode debug et j'ai une erreur qui s'affiche sur l'écran à chaque fermeture de fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (perso:3121): Gtk-CRITICAL **: IA__gtk_style_detach: assertion `style->attach_count > 0' failed
    Cette erreur vient d'où ? Est-elle évitable ou incontournable ?

  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
    Je ne me souviens plus quelle version de GTK+ tu utilises, alors J'ai regardé dans GTK 2.16...

    On dirait que tu appelles gtk_style_detach (directement ou indirectement) sur un GtkStyle qui n'a pas été attaché.

    La ligne qui t'affiche l'erreur est en gras.

    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
    /**
     * gtk_style_detach:
     * @style: a #GtkStyle
     *
     * Detaches a style from a window. If the style is not attached
     * to any windows anymore, it is unrealized. See gtk_style_attach().
     *
     */
    void
    gtk_style_detach (GtkStyle *style)
    {
      g_return_if_fail (GTK_IS_STYLE (style));
      g_return_if_fail (style->attach_count > 0);
    
      style->attach_count -= 1;
      if (style->attach_count == 0)
        {
          g_signal_emit (style, unrealize_signal, 0);
    
          g_object_unref (style->colormap);
          style->colormap = NULL;
    
          if (style->private_font_desc)
    	{
    	  if (style->private_font)
    	    {
    	      gdk_font_unref (style->private_font);
    	      style->private_font = NULL;
    	    }
    
    	  pango_font_description_free (style->private_font_desc);
    	  style->private_font_desc = NULL;
    	}
    
          g_object_unref (style);
        }
    }

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    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 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Citation Envoyé par liberforce Voir le message
    On dirait que tu appelles gtk_style_detach (directement ou indirectement) sur un GtkStyle qui n'a pas été attaché.
    J'avoue ne pas avoir attaché de GtkStyle...
    Il faut le faire quand et comment ? Ça sert à quoi ?

    Encore un point que j'ai loupé

  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
    Comme je l'ai dit, tu peux l'avoir appelé indirectement, c'est à dire que ce sont des fonctions que tu manipules qui utilisent GtkStyle, et que tu les manipules mal, ce qui entraîne ce warning. Je ne sais pas trop à quoi correspond cette classe, cela a l'air relié à la gestion de fontes ou tes modifications de couleur de fond.

    Savoir à partir de quand cela a commencé à ne plus fonctionné aurait permis de restreindre le périmètre de recherche. Tu as tes versions précédentes pour voir depuis quand le problème se produit ?

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    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 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Le programme marche !
    Mais, si je le fais fonctionner en mode debug j'ai ses erreurs. Et assez régulièrement lors de la fermeture des fenêtres. Je trouve que ça ne fait pas joli. Ce n'est peut-être qu'une partie à peine visible d'un gros iceberg de bêtises !

  6. #6
    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
    Dans ce cas, il ne te reste plus qu'à travailler par dichotomie...
    Parsème cette ligne de code dans ton programme, et en étudiant les traces générées, restreins l'ensemble à rechercher.
    Tu finiras par trouver la ligne qui provoque le problème.

  7. #7
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    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 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Bonjour

    Je reviens sur ce problème que je vais cherchder à résoudre.
    Il a lieu quand je ferme une fenêtre, mais pas n'importe comment ! Si je clique sur la croix en haut à gauche de la fenêtre, croix gérée par le système, rien ne se passe (pas de warninig), mais si je clique sur le bouton gtk "Fermer" qui donne sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_emit_by_name (((GtkWidget **)param)[FENETRE],"destroy");
    J'ai l'erreur lors de la fermeture. Je vais chercher plus profondément ces prochains jours en fonction de mon temps disponible.

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 306
    Points : 4 977
    Points
    4 977
    Billets dans le blog
    5
    Par défaut
    Tu as certainement attaché un callback au signal "destroy". Le problème se trouve donc dans ce callback. Pourrais-tu nous le montrer?

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    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 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Le voilà avec des printf :
    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
    void fin_perso(GtkWidget *p_widget, gpointer param)
    {
     GtkWidget *p_dialog = NULL;
     unsigned short i;
     
     if (((GtkWidget **)param)[3]) g_signal_emit_by_name(((GtkWidget **)param)[FILS],"destroy");
     if (((unsigned short **)param)[MODIF][0]==1)
     {
        p_dialog =  gtk_message_dialog_new (GTK_WINDOW(((GtkWindow **)param)[FENETRE]),GTK_DIALOG_MODAL,GTK_MESSAGE_QUESTION,GTK_BUTTONS_YES_NO,"Sauvegarder les modifications\nde la fenêtre 'Résumé' ?");
        switch(gtk_dialog_run(GTK_DIALOG(p_dialog)))
        {
            case GTK_RESPONSE_NO:
                gtk_widget_destroy(p_dialog);
                break ;
            default :
                gtk_widget_destroy(p_dialog);
                sauvegarde_perso (NULL, param);
                break;
        }
     }
    printf("ici !\n");
     for (i=0;i<46;i++)
     {
         printf("%hu\n",i);
            if (i!=4) free(((void **)param)[i]);
         printf("%hu\n",i);
     }
     /* effacer dans param 9 à partir de param 7 */
    printf("ici 1 !\n");
     free(param);
    printf("ici 2 !\n");
     
     /* parametres inutilises */
     (void)p_widget;
    printf("ici 3 !\n");
    }
    Et voici ce que donnent les printf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    45
    ici 1 !
    ici 2 !
    ici 3 !
     
    (perso:11456): Gtk-CRITICAL **: IA__gtk_style_detach: assertion `style->attach_count > 0' failed
    Donc, c'est après...

    nb : enb utilisant je vois que l'erreur se fait autour de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_emit_by_name (((GtkWidget **)param)[FENETRE],"destroy");
    Si je ferme la fenêtre en cliquant sur la croix, j'ai tous les prints sans l'erreur finale.

  10. #10
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 306
    Points : 4 977
    Points
    4 977
    Billets dans le blog
    5
    Par défaut
    A quoi te sert ce test au juste?

  11. #11
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    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 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Quel test ?

    Le premier : détruire une autre fenêtre si elle est ouverte.
    Le second : demander d'enregistrer les modifications s'il y en a eu.

  12. #12
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 306
    Points : 4 977
    Points
    4 977
    Billets dans le blog
    5
    Par défaut
    Le fait de quitter la boucle principale gtk va détruire toutes les fenêtres. Il me semble donc que forcer la destruction ne sert à rien. As-tu essayé?

  13. #13
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    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 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Ce n'est pas la boucle principale que je ferme ici !
    Ici, je ferme une fenêtre fille de la fenêtre principale et la fille de la fille en cas de besoin.

  14. #14
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 306
    Points : 4 977
    Points
    4 977
    Billets dans le blog
    5
    Par défaut
    Ok. Donc pour être sûr désactive temporairement cette destruction (la fameuse ligne qui semble poser problème) et fais tes tests. Ca permettra de au moins de cibler précisément le problème.

  15. #15
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    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 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Je peux bien essayer, mais, j'ai l'impression qu'il y a confusion entre les deux g_signal_emit_by_name(((GtkWidget **)param)[?],"destroy");
    En effet, il y a le premier qui ferme la fenêtre fille, celui qui ferme la fenêtre fille de la fenêtre principale. C'est autour de celui-là que ce passe le problème.
    Il y a le second, celui qui est fait après le if qui ferme la fenêtre fille de la fenêtre fermée par le premier. Enfin, uniquement si cette fenêtre est ouverte (d'où le if) !

    Mettre la ligne en commentaire ne donne rien...

  16. #16
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 306
    Points : 4 977
    Points
    4 977
    Billets dans le blog
    5
    Par défaut
    Je suppose qu'une fois que tu as détruit ((GtkWidget **)param)[3] tu places sa valeur à NULL.
    Maintenant un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (((GtkWidget **)param)[3])
    {
      gtk_widget_destroy((GtkWidget **)param)[3]);
      ((GtkWidget **)param)[3] = NULL;
    }
    suffit. Il n'est pas nécessaire de forcer le signal.

  17. #17
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    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 602
    Points : 7 837
    Points
    7 837
    Par défaut
    J'avoue ne pas faire le différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_emit_by_name (((GtkWidget **)param)[FENETRE],"destroy");
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_widget_destroy(((GtkWidget **)param)[FENETRE]);
    , mais en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_widget_destroy(((GtkWidget **)param)[FENETRE]);
    , j'ai cette erreur en moins !
    C'est donc la première erreur que je fais sauter.

    Mais pourquoi ?

  18. #18
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 306
    Points : 4 977
    Points
    4 977
    Billets dans le blog
    5
    Par défaut
    Les voix de Gtk+ sont parfois impénétrables

  19. #19
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    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 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Mais, si j'ai essayé de faire un programme avec gtk, c'était justement pour emprunter les voies de gtk ! Je comptes bien y pénétrer

  20. #20
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 306
    Points : 4 977
    Points
    4 977
    Billets dans le blog
    5
    Par défaut
    Gros dégoutant

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Gtk-CRITICAL erreur gtk_box_pack: assertion
    Par fab13 dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 08/06/2013, 15h36
  2. Gtk-CRITICAL **: gtk_text_buffer_emit_insert:
    Par cassignol dans le forum Interfaces Graphiques
    Réponses: 7
    Dernier message: 20/07/2009, 11h57
  3. erreur gtk critical
    Par muskachew dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 27/06/2009, 10h46
  4. (<unknown>:7854): Gtk-CRITICAL etc (Swing)
    Par rXpCH dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 24/10/2008, 15h59
  5. Problème de debuggage : Gtk-CRITICAL
    Par thibane dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 20/03/2007, 18h54

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