Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21776
  • 博文数量: 8
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 75
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-26 19:07
文章分类
文章存档

2010年(8)

我的朋友

分类:

2010-06-03 14:47:22

    最近在用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) |
给主人留下些什么吧!~~