最近在用GTK做一些界面开发,其中需要将程序返回的一些消息在文本视图(textview)中打印出来。开始搞了好久,程序总是会莫名的出错,要不界面卡死,要不直接崩溃,后来在网上查了一下,终于搞定。
具体实现方法如下。
首先,在 main()中加入GTK的多线程支持。
int main(int argc, char *argv[]) { ... if (!g_thread_supported()) g_thread_init(NULL); gdk_threads_init(); ... gtk_init (&argc, &argv); ... }
|
然后是我写的gtk_text_view_printf()。
char * gtk_text_view_printf (GtkTextView *text_view, char *text_string, char *tag_name) { GtkTextBuffer *buffer; GtkTextIter start, end; GtkTextMark *mark;
gdk_threads_enter(); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW (text_view));
pthread_mutex_lock(&mut_buf); gtk_text_buffer_get_end_iter (buffer, &start); gtk_text_buffer_insert_with_tags_by_name (buffer, &start, text_string, strlen(text_string), tag_name, NULL); gtk_text_buffer_get_end_iter (buffer, &end); gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end);
mark = gtk_text_buffer_create_mark (buffer, NULL, &end, TRUE); gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW (text_view), mark);
pthread_mutex_unlock(&mut_buf); gtk_widget_show(GTK_WIDGET(text_view));
gdk_threads_leave(); return text_string; }
|
注意gdk_threads_enter()和gdk_threads_leave()的使用。
然后在程序中就可以调用gtk_text_view_printf()来打印消息了,不过必须注意该函数只能在子线程中调用,如果在主线程中调用界面会死掉。
另外,编译的时候要加上gthread-2.0的支持。
如果是用autotools的话,在configure.in中加入:
pkg_modules = "gtk+-2.0 >= 2.0.0 gdk-2.0 gthread-2.0" PKG_CHECK_MODULES(PACKAGE, [$pkg_modules])
|
PS:有人说要在main()调用gtk_main()的前后加上gdk_threads_enter()和gdk_threads_leave(),像这样:
int main(int argc, char *argv[]) { ... gdk_threads_enter(); gtk_main(); gdk_threads_leave(); ... }
|
我没加,不过也没出什么问题。
阅读(3216) | 评论(0) | 转发(0) |