2013-03-27 33 views
0

我使用的是GTK,當我將文本插入到TextView中時,它似乎在後臺線程中處理它。如何強制TextView處理其文本並進行渲染

  1. 我插入1行
  2. 我做一些其他的東西一文,但在這個非常時刻,文本甚至尚未渲染,
  3. 我用ScrollToIter(),因此它滾動到底 - 但由於該文本還沒有呈現,沒有終點滾動到,所以沒有什麼發生

如果我插入滾動結束到一些計時器,它的作品 - 但它是相當緩慢和怪異。 (文本首先被繪製,然後在完成之後跳到底部,對於長文本它會跳幾次,因爲繪圖需要很長時間)。

同樣每當我更改Buffer.Text時,控件都會重繪所有行(在循環中逐行添加,這看起來也非常煩人)。

我需要做的是:

  1. 變化TextView.Buffer.Text不同的字符串
  2. 強制的TextView來處理所有的文本並立即重繪
  3. 滾動到底

例如:

讓我們假設你想創建一個文本編輯器,它應該是打開大文本文件(100 000行),並在打開文件後立即滾動到底部。理想情況下,您打開文件,首先看到的是底部。這是許多文本編輯器中發生的事情。我想用這個gtk的東西來實現這個行爲。

我該怎麼做?

回答

0

這不是基於主循環的工具包中事件驅動編程的工作方式。使用主循環(如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

相關問題