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:
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:
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 :D.
Merci, a++.