Hallo,
EDITED: Aufgrund von http://blogs.operationaldynamics.com/andrew/software/gnome-desktop/gtk-thread-awareness weiß ich, dass die Benutzung von pthreads mit GTK nur eingeschränkt möglich ist. Hätte jemand eine Idee, wie ich das am besten lösen könnte? Hab gelesen, dass die Glib auch Threads anbietet. Funktioniert es mit denen besser?
ich hätte eine Frage. Ich habe in C einen Chat geschrieben (Source-Code ist GPL, siehe unten) welcher auf UDP-Nachrichten wartet und diese dann in einem GtkTextView darstellt. Das Programm besteht aus einem GtkWindow mit Eingabefelder und dem TextView. Zusätzlich gibt es eine Funktion zum (UDP)-Versenden von Daten. Nachdem alle Widgets erstellt wurden, wird ein Server Thread gestartet, welches die UDP Nachrichten aus dem Socket abholt und in die TextView schreiben soll.
Also schematisch dargestellt
main()->alle Widgets erstellen und anzeigen->Socket1 zum versenden von daten->pthread_create(&server...)->gtk_main()
ab pthread_create wird parallel die server funktion ausgeführt. diese sieht so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | char puffer[BUF]; static void *server_main(void *val) { sock2 = create_socket( AF_INET, SOCK_DGRAM, 0); bind_socket(&sock2, INADDR_ANY, PORT); while (1) { memset(puffer, 0, BUF); UDP_recv(&sock2, puffer, BUF-1); gtk_text_buffer_insert_at_cursor(textpuffer, "Recv: ", -1); puffer[BUF-1] = '\0'; gtk_text_buffer_insert_at_cursor(textpuffer, puffer, -1); gtk_text_buffer_insert_at_cursor(textpuffer, "\n", 1); } } |
wenn ich jetzt sämtliche gtk_text_buffer-Funktionen rausschwerfe und mir den inhalt der UDP-Pakete in der Konsole anzeigen lasse, dann funktioniert es dauerhaft (hab über eine stunde lang pakete gespammt). das lässt mich darauf schließen, dass UDP an sich ja funktioniert. Aber anscheinend gibt es immer Probleme, sobald Text angezeigt wird.
Sammlung von Fehlermeldungen:
*** glibc detected *** ./chat: malloc(): memory corruption: 0x
(chat:8294): Pango-CRITICAL **: pango_layout_get_cursor_pos: assertion
index >= 0 && index <= layout->length' failed
(chat:8300): Gtk-CRITICAL **: gtk_text_layout_real_invalidate: assertion
layout->wrap_loop_count == 0' failed
(chat:8300): GLib-GObject-CRITICAL **: g_object_unref: assertion
object->ref_count > 0' failed *** glibc detected *** ./chat: free(): invalid pointer: 0x0981a6a0 *** ======= Backtrace: ========= /lib/tls/i686/cmov/libc.so.6(+0x6b591)[0xf11591] /lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0xf12de8] /lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xf15ecd] /lib/libglib-2.0.so.0(g_free+0x36)[0x776fc6] (...)
(chat:8333): Gtk-WARNING **: Invalid text buffer iterator: either the iterator is uninitialized, or the characters/pixbufs/widgets in the buffer have been modified since the iterator was created. You must use marks, character numbers, or line numbers to preserve a position across buffer modifications. You can apply tags and insert marks without invalidating your iterators, but any mutation that affects 'indexable' buffer contents (contents that can be referred to by character offset) will invalidate all outstanding iterators
Was mich wundert:
* 99% der Fehlermeldungen stammen von der Glib
* Übertragungsfehler gibt es de facto keine
* Objekte vom Typ GtkTextIter kommen im Quelltext nirgends vor und trotzdem kommt eine derartige Fehlermeldung (letzte fehlermeldung)
Meine Vermutungen:
* Glib ist mit großer Datenmenge anscheinend überlastet (was mich aber sehr wundern würde)
* Problem mit den Zeichenkodierungen
* Das Problem MUSS mit der Darstellung zu tun haben, weil das Programm ohne gtk_text_buffer-Funktionen funktioniert.
* Funktionen für den Netzwerkzugriff sind sauber
kann mir jmd einen guten Tipp geben?
Quellcode ist hier: http://pastebin.com/Rq6kv5iQ (Netzwerkspezifische Sachen sind weggelassen)
Für Hilfe wäre ich dankbar und wer Mitarbeiten will, ist herzlich willkommen
2004 – 2012 ubuntuusers.de • Einige Rechte vorbehalten