I'm doing a multithreading program using GTK+ (a POS emulator) and I'm using something like that:
/****************************************************************************************************/ #include <gtk/gtk.h> gpointer cb_t1(gpointer d) { while (1) { g_usleep(1000 * 2000); gdk_threads_enter(); /* my turn! i'll use GTK+... */ g_debug("thread 1 in action!"); gtk_label_set_text(GTK_LABEL(d), "thread1"); gdk_flush(); /* flushes all pending commands... */ gdk_threads_leave(); /* i'm done! */ } } gpointer cb_t2(gpointer d) { while (1) { g_usleep(1000 * 3000); gdk_threads_enter(); /* my turn! i'll use GTK+... */ g_debug("thread 2 in action!"); gtk_label_set_text(GTK_LABEL(d), "thread2"); gdk_flush(); /* flushes all pending commands... */ gdk_threads_leave(); /* i'm done! */ } } gboolean cb_key_press (GtkWidget *w, GdkEventKey *e, gpointer d) { g_message("%d", e->keyval); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *label; g_thread_init(NULL); /* glib threads init */ gdk_threads_init(); /* gdk threads init */ gdk_threads_enter(); /* protects the main loop */ gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_events(window, GDK_KEY_PRESS_MASK); g_signal_connect( G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect( G_OBJECT(window), "key-press-event", G_CALLBACK(cb_key_press), NULL); gtk_widget_show(window); label = gtk_label_new(""); gtk_container_add(GTK_CONTAINER(window), label); gtk_widget_show(label); g_thread_create(cb_t1, (gpointer) label, FALSE, NULL); g_thread_create(cb_t2, (gpointer) label, FALSE, NULL); gtk_main(); gdk_threads_leave(); /* we're done... */ } /****************************************************************************************************/ Here we have three threads unsing the GTK+ without conflicts... Basically, we must protect the gtk_main() loop with the gdk_threads_enter()/gdk_threads_leave() pair and for each function that uses the GTK+ we must surrounding that with a gtk_thread_enter()/gdk_threads_leave() pair. This functions just lock a previously definied mutex (or something like that). More info: http://developer.gnome.org/doc/API/2.0/gdk/gdk-Threads.html http://developer.gnome.org/doc/API/2.0/glib/glib-Threads.html PS: Sorry Michael. =P _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list