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 :

Erreur lors de l'écriture dans un Gtk::TextBuffer avec un thread


Sujet :

GTK+ avec C & C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Erreur lors de l'écriture dans un Gtk::TextBuffer avec un thread
    Bonjour, voila je developpe un petit chat. J'envoie des messages a un serveur, et il m'en envoie. Pour recevoir ses messages ( ceux du serveur ), je lance un thread qui fait un recv et qui met les caractrères reçus dans un Gtk::TextBuffer. Le problèmes est que lors de l'exécution j'ai des fois et aléatoirement ( ca peut arriver tout de suite comme ca peut ne pas arriver pendant 5 minutes ) des erreurs diverses et variées mais surtout très claires, a base d'adresses memoire de shared objects et compagnie.
    J'ai essaye pas mal de choses, faire un mutex qui bloque le thread quand je veux acceder au Gtk::TextBuffer, ca n'a pas marché. La partie du code qui fait ces erreurs a l'exection est je pense celle ci :

    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
     
    void* ClientWindow::reception_thread_function(void *arg) {
     
        ClientWindow *cli_win= static_cast<ClientWindow*> (arg);
     
        while(1) {
            if ( recv(cli_win->sockfd, (void*)cli_win->buff, 256, 0 ) != -1 ) {
                std::cout << "DATA RECEIVED : " << cli_win->buff << " \n";
     
                if(strstr(cli_win->buff, "chat-client-send-file:")) { 
                std::cout << "quit sent by server\n"; exit(0);}
     
                // affichage du texte recu dans la textview, a la suite du reste
                Glib::ustring text=cli_win->text_buffer->get_text();
                text=text+"\n";
                text=text+cli_win->buff;
                cli_win->text_buffer->set_text(text);
                cli_win->text_view->set_buffer(cli_win->text_buffer); // au cas ou, ca pourra peut etre fix les iterateurs...
     
                // on scroll la text_view jusquau dernier insert
                Glib::RefPtr<Gtk::TextBuffer::Mark> mark=cli_win->text_buffer->get_insert();
                cli_win->text_view->scroll_to(mark);
     
                }
                memset(cli_win->buff, 0x0, 256);
        }
     
        return NULL;
    }
    C'est la fonction qu'execute le thread. Quand on appuie sur le bouton envoyer du chat, le texte est aussi mis dans le Gtk::TextBuffer mais je ne pense pas que ca vienne de la.
    En gros les erreurs que je recois dans stderr sont du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    *** glibc detected *** ./chatclient: double free or corruption (out): 0x082c25e8 ***
    ======= Backtrace: =========
    /lib/libc.so.6[0x1d8fb6]
    /lib/libglib-2.0.so.0(g_free+0x37)[0x3ce137]
    /lib/libglib-2.0.so.0(g_slist_foreach+0x29)[0x3e7539]
    /usr/lib/libgtk-x11-2.0.so.0(gtk_text_layout_free_line_display+0x4e)[0x6126c2e]
    /usr/lib/libgtk-x11-2.0.so.0(gtk_text_layout_get_line_display+0x6e)[0x6126cde]
    /usr/lib/libgtk-x11-2.0.so.0[0x61288e2]
    /usr/lib/libgtk-x11-2.0.so.0(gtk_text_layout_wrap+0x20)[0x6126450]
    /usr/lib/libgtk-x11-2.0.so.0[0x6109825]
    /usr/lib/libgtk-x11-2.0.so.0(gtk_text_layout_validate_yrange+0x1fd)[0x612699d]
    Voila donc si quelqu'un pouvait m'informer sur comment *bien* mettre des donnees dans un textbuffer sans que ca explose ca serait super sympa .
    Merci, a++.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    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 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut
    Tu essayes de libérer un espace mémoire invalide. En d'autres termes la validité d'un pointeur utilisé n'est plus bonne.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Le probleme c'est que je ne fais aucun delete ou meme free...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    bump. Personne sait comment ecrire proprement dans une TextView via les TextBuffers et leurs iterateurs alors ? La doc a ses limites sur ce coup la, une ame charitable ayant deja fait ca qui pourrait expliquer serait vraiment genial !

    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
     
     
    static void
    iter_set_from_segment (GtkTextRealIter *iter,
                           GtkTextLine *line,
                           GtkTextLineSegment *segment)
    {
      GtkTextLineSegment *seg;
      gint byte_offset;
     
      /* This could theoretically be optimized by computing all the iter
         fields in this same loop, but I'm skipping it for now. */
      byte_offset = 0;
      seg = line->segments;
      while (seg != segment)
        {
          byte_offset += seg->byte_count;
          seg = seg->next;
        }
     
      iter_set_from_byte_offset (iter, line, byte_offset);
    }
    En fait c'est dans cette fonction de gtk que l'erreur se passe ( gtktextiter.c ).
    Dans la ligne seg = line->segments, en fait le pointeur seg reste NULL car line->segments est NULL. Donc quand dans le while on veut incrementer byte_offset en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    byte_offset += seg->byte_count;
    ca seg fault car seg est null.
    Maintenant, je vois pas pourquoi le champ segments de la structure line passée a cette fonction n'est pas initialise ou pointe sur une mauvaise addresse...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bon il semble que j'aie réglé mon probleme. Si ca intéresse quelqu'un je posterai la solution . a+ !

Discussions similaires

  1. Erreur lors de l'écriture dans l'ini
    Par LuckyLuke56 dans le forum Outils
    Réponses: 1
    Dernier message: 25/08/2008, 20h12
  2. [MySQL] Erreur lors de l'insertion dans ma base de doneés
    Par ANISSS dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 15/11/2006, 12h47
  3. Réponses: 8
    Dernier message: 13/11/2006, 11h19
  4. Erreur E/S 32 lors de l'écriture dans un fichier text.
    Par yosthegost dans le forum Delphi
    Réponses: 6
    Dernier message: 01/06/2006, 11h45
  5. Passer à la ligne lors de l'écriture dans un fichier
    Par hams dans le forum Assembleur
    Réponses: 4
    Dernier message: 17/04/2005, 19h25

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