如何强制TextView处理其文本并进行渲染

问题描述:

我使用的是GTK,当我将文本插入到TextView中时,它似乎在后台线程中处理它。如何强制TextView处理其文本并进行渲染

  1. 我插入1行
  2. 我做一些其他的东西一文,但在这个非常时刻,文本甚至尚未渲染,
  3. 我用ScrollToIter(),因此它滚动到底 - 但由于该文本还没有呈现,没有终点滚动到,所以没有什么发生

如果我插入滚动结束到一些计时器,它的作品 - 但它是相当缓慢和怪异。 (文本首先被绘制,然后在完成之后跳到底部,对于长文本它会跳几次,因为绘图需要很长时间)。

同样每当我更改Buffer.Text时,控件都会重绘所有行(在循环中逐行添加,这看起来也非常烦人)。

我需要做的是:

  1. 变化TextView.Buffer.Text不同的字符串
  2. 强制的TextView来处理所有的文本并立即重绘
  3. 滚动到底

例如:

让我们假设你想创建一个文本编辑器,它应该是打开大文本文件(100 000行),并在打开文件后立即滚动到底部。理想情况下,您打开文件,首先看到的是底部。这是许多文本编辑器中发生的事情。我想用这个gtk的东西来实现这个行为。

我该怎么做?

这不是基于主循环的工具包中事件驱动编程的工作方式。使用主循环(如GTK +)的工具包进行事件驱动编程的基本原则是:您从不阻止主循环。

GTK +不使用单独的线程进行渲染和布局:您执行的每个阻止操作都将阻止其他操作运行,其中包括绘图,事件处理和您自己的代码。

使用TextBuffer提供的通知信号,您应该在缓冲区更新后滚动到TextView的底部;您应该也从来没有在紧密的循环中插入(长)文本:如果您想要逐行插入文本,或更可能块大块,您应该将作业细分为更小的块,并使用空闲回调或超时回调,这将在主循环内执行。

+0

ok我对事件很好,但问题是,什么事件名称是控制完成其绘图?如果我知道它,我可以运行滚动以结束信号(顺便说一句,我没有在循环中插入一个长文本 - 我插入一行代码长文本(textview.Buffer.Text = longtext)它似乎我喜欢,如果它被插入一个循环给定的方式如何被呈现 – Petr 2013-03-27 22:09:45

+0

顺便说一句 - 你确定没有办法来“加快”文本渲染?我想知道有多少文本编辑器编写的GTK句柄开放的大文本文件,因为我从来没有看到这在我的应用程序中看到的任何地方... – Petr 2013-03-27 22:13:44