Threading Probleme mit GTK

Baue ich eine ziemlich einfache C-Anwendung mit GTK, aber haben Sie einige blocking-IO, die Aktualisierungen an der Benutzeroberfläche. Um dies zu tun, starte ich einen neuen pthread Recht vor gtk_main() als solche:

/* global variables */
GMainContext *mainc;

/* local variables */
FILE *fifo;
pthread_t reader;

/* main() */
mainc = g_main_context_default();
pthread_create(&reader, NULL, watch_fifo, argv[argc-1]);
gtk_main();

Wenn die pthread liest einige Daten, aktualisiert die GUI etwa so:

g_main_context_invoke(mainc, set_icon, param);

Wo set_icon ist

gboolean set_icon(gpointer data)
{
    char *p = (char*)data;
    gtk_status_icon_set_from_icon_name(icon, p);
    return FALSE;
}

Das ganze funktioniert die meiste Zeit, aber hin und wieder bekomme ich diese merkwürdige Fehlermeldung:

[xcb] Unbekannt-Sequenznummer, die während der Verarbeitung der Warteschlange 
[xcb] die Meisten wahrscheinlich, dass dies ist ein multi-threaded-client-und XInitThreads wurde nicht genannt 
[xcb] Abbrechen, tut mir Leid, dass. 
mktrayicon: xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' ist fehlgeschlagen. 

Ich dachte, der ganze Punkt, der mit g_main_context_invoke war Probleme zu vermeiden, die mit threads? Ein wenig Googeln stieß ich auf gdk_threads_init, gdk_threads_enter und Freunde, aber Sie alle scheinen veraltet? Ich kenne die GTK-Dokumentation besagt, dass alle GUI-updaes durchgeführt werden sollte, der Haupt-thread, aber das nicht kombinieren alle, die gut mit blocking-IO, und ich würde es vorziehen, nicht zu haben, zu konstruieren, die eine komplexe Kommunikation zwischen den threads.

Und so, meine Frage ist, wie ich richtig damit umgehen?

EDIT: Der vollständige code gesehen werden kann hier
EDIT2: ein update basierend auf dem @ptomato Antwort, ich habe verschoben, um GThreads und mit gdk_threads_add_idle() wie in diese Begehen, aber das problem ist immer noch vorhanden.

Hast du einen code zur Verfügung, ich habe mit gtk+ seit geraumer Zeit und nie stolperte über dieses Problem..
Der gesamte code ist verfügbar auf GitHub als mit der post.
Ah, übersehen, danke!
Beachten Sie, dass Sie verwenden werden dieser - link, um zu sehen, mit dem original-code, und dieser - link, um zu sehen, den code nach der Umsetzung der Vorschläge von @ptomato. Dieser - link verweist Sie auf die Feste version der Datei.

InformationsquelleAutor Jon Gjengset | 2013-09-05

Schreibe einen Kommentar