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 :
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.
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; }
En gros les erreurs que je recois dans stderr sont du type :
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
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].
Merci, a++.
Partager