我怎么能强制TextView处理它的文本和渲染它

本文关键字:文本 处理 怎么能 TextView | 更新日期: 2023-09-27 18:06:12

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

  1. 我在1行插入了一个文本
  2. 我做了一些其他的东西,但在这一刻,文本甚至还没有渲染
  3. 我使用ScrollToIter()使它滚动到底部-但是因为文本还没有渲染,没有结束滚动,所以什么也没有发生

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

也每次当我改变缓冲区。文本控件重新绘制所有行(在循环中逐行追加,这看起来也很烦人)。

我需要做的是:

  1. 将TextView.Buffer.Text更改为不同的字符串
  2. 强制TextView处理所有文本并立即重新绘制
  3. 滚动到底部
在例子:

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

我该怎么做呢?

我怎么能强制TextView处理它的文本和渲染它

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

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

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