免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8369 | 回复: 5
打印 上一主题 下一主题

gtk_text_buffer_insert()函数这样用不知道对不? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-06 18:58 |只看该作者 |倒序浏览
我写一个往gtktextview中插入数据的函数,
void
insert_text_to_text4 (gchar * data)
{
   GtkTextBuffer *buffer;
   GtkTextIter end;
   buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text4)); //text4是一个gtktextview控件
   gtk_text_buffer_get_end_iter(buffer,&end);
   gtk_text_buffer_insert(buffer, &end, data, -1);
   gtk_text_buffer_get_end_iter(buffer,&end);
   gtk_text_buffer_insert(buffer, &end, "\n", -1);
}

在进行插入的时候大部分时候正常.但偶尔会出现如下的错误:
Gtk-WARNING **: Invalid text buffer iterator: either the iterator is uninitialized, or the characters/pixbufs/widgets in the buffer have been modified since the iterator was created.
You must use marks, character numbers, or line numbers to preserve a position across buffer modifications.
You can apply tags and insert marks without invalidating your iterators,
but any mutation that affects 'indexable' buffer contents (contents that can be referred to by character offset)
will invalidate all outstanding iterators
段错误

论坛徽章:
0
2 [报告]
发表于 2006-05-07 14:25 |只看该作者
建议仔细看看文档中对 gtk_text_buffer_insert() 的说明。

可以看到,gtk_text_buffer_insert() 会产生“insert_text”信号,实际的插入操作是在这个信号的默认处理函数中进行的。因此,gtk_text_buffer_insert() 函数执行后并不意味着插入操作的完成。

对于你的这个问题,有三种解决方法:

1. 在两次插入操作之间加入一段等待时间。

2. 在两次插入操作之间检查有无待处理的事件;如果有,处理之。
  1.         while (gtk_events_pending ())
  2.           gtk_main_iteration ();
复制代码

3. 把两次插入操作合并为一次插入操作。把原来两次插入的文字合并到一起后再插入即可。

对于你的这个问题,推荐方式 3。

论坛徽章:
0
3 [报告]
发表于 2006-05-07 21:44 |只看该作者
谢谢你的意见,不过你后面两中我都试过了,还是有同样的问题

论坛徽章:
0
4 [报告]
发表于 2006-05-08 19:38 |只看该作者
如果你的函数是重复调用的话,在每次文字插入之后都应该进行事件更新。你这样试过了吗?

论坛徽章:
0
5 [报告]
发表于 2006-05-08 22:12 |只看该作者
楼上的大哥,我是要重复调用,
在每次文字插入之后都应该进行事件更新?这个怎么实现呢?
难道在代码的最后加    while (gtk_events_pending ())
                                    gtk_main_iteration ();
不行?  希望你能够给点意见
先谢谢了

论坛徽章:
0
6 [报告]
发表于 2006-05-09 17:43 |只看该作者
问题解决了,是我的可能没有解决那些没有打印的字符,还有线程的处理不是很好
下面的可以处理好
void
insert_text_to_text4 (gchar * data)
{GtkTextBuffer *buffer;
   GtkTextIter end;
   gchar * escape, * text;

   escape = g_strescape (data, NULL);
   text = g_strconcat (escape, "\n", NULL);
   buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text3));
   gtk_text_buffer_get_end_iter(buffer, &end);
   gtk_text_buffer_insert(buffer, &end, text, -1);


   g_free (escape);
   g_free (text);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP