最近在编写一个gtk的多线程程序,在一个线程中需要弹出一个对话框(gtk_message_dialog),结果就Segment fault了,而且还会报在src/xcb_io.c有 process_responses,查了一下,果然是说 X isn't tread-safe,所以需要用 g_idle_add()来更新界面,使用后程序正常了。
简单来说就是这样:
gboolean dialog_example(gpointer data)
{
......;
return FALSE;
}
......;
gtk_add_idle(refresh_ui, data);
程序里的例子:
gboolean create_message_dialog(gchar* message)
{
GtkWidget* dialog_box;
dialog_box = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, message);
gtk_dialog_run(GTK_DIALOG(dialog_box));
gtk_widget_destroy(dialog_box);
return FALSE;
}
.......;
g_idle_add(create_message_dialog, "data example");