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

时间:2013-03-27 15:58:42

标签: c# gtk

我正在使用GTK,当我将文本插入TextView时,它似乎在后台线程中处理它。

  1. 我在1行插入文字
  2. 我做了其他一些事情,但是在这个时刻,文字还没有在那里呈现
  3. 我使用ScrollToIter()使其滚动到底部 - 但因为文本尚未渲染,所以没有结束滚动,所以没有真正发生
  4. 如果我将滚动插入到一些计时器中,它可以正常工作 - 但它很慢而且很奇怪。 (首先绘制文本,然后在完成后跳转到底部,对于长文本,它会跳转几次,因为绘图需要很长时间)。

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

    我需要做的是:

    1. 将TextView.Buffer.Text更改为其他字符串
    2. 强制TextView处理所有文本并立即重绘
    3. 滚动到底部
    4. 例如:

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

      我该怎么做?

1 个答案:

答案 0 :(得分:1)

这不是基于主循环的工具包中的事件驱动编程的工作原理。使用主循环(如GTK +)的工具包使用事件驱动编程的基本原则是:永远不会阻止主循环。

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

使用TextBuffer提供的通知信号,一旦缓冲区更新,您应该滚动到TextView的底部;你还应该从不在紧密循环中插入(长)文本:如果你想逐行插入文本,或者更可能是按块插入文本,你应该将作业细分为更小的部分,并使用空闲回调或超时回调,将在主循环中执行。