Sto creando un semplice C application utilizzando GTK, ma devo eseguire alcuni IO di blocco che attiveranno gli aggiornamenti alla GUI. Per fare questo, comincio una nuova pthread
destra prima gtk_main()
in quanto tale:Problemi di filettatura con GTK
/* 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();
Quando il pthread
legge alcuni dati, si aggiorna l'interfaccia grafica in questo modo:
g_main_context_invoke(mainc, set_icon, param);
Dove set_icon
è
gboolean set_icon(gpointer data)
{
char *p = (char*)data;
gtk_status_icon_set_from_icon_name(icon, p);
return FALSE;
}
Questo tutto funziona la maggior parte del tempo, ma ogni tanto ottengo questo curioso messaggio di errore:
[xcb] Unknown sequence number while processing queue [xcb] Most likely this is a multi-threaded client and XInitThreads has not been called [xcb] Aborting, sorry about that. mktrayicon: xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
Ho pensato che il punto principale dell'utilizzo di g_main_context_invoke
era evitare problemi con i thread? Facendo un po 'di googling, mi sono imbattuto in gdk_threads_init
, gdk_threads_enter
e amici, ma sembrano tutti deprecati? So che la documentazione di GTK dice che tutti gli aggiornamenti della GUI dovrebbero essere eseguiti sul thread principale, ma questo non combina molto bene con l'IO di blocco, e preferirei non dover costruire un meccanismo di comunicazione complesso tra i thread.
E quindi, la mia domanda è, come devo affrontare correttamente questo?
EDIT: Il codice completo è visibile here EDIT2: come un aggiornamento in base alla risposta di @ ptomato, mi sono trasferito a GThread
s ed utilizzando gdk_threads_add_idle()
come si vede nella this impegnarsi, ma il problema è ancora presente.
Avete un po 'di codice disponibile, sto usando gtk + per un bel po' di tempo e non è incappato in questo problema .. – drahnr
L'intero codice è disponibile su [GitHub] (https://github.com/jonhoo/mktrayicon) come collegato al post. –
Ah, mancato grazie! – drahnr