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++.