2013-04-16 55 views
1

我發現怪異異常的GTK TextView的,希望有人能解釋它們。我怎麼能自動滾動到底在GTK的TextView

有一個簡單的功能,滾動到窗口底部的:

richTextBox.ScrollToIter(richTextBox.Buffer.EndIter, 0, true, 0, 0); 

這大概應該是工作和工作在大多數情況下。但有時它崩潰與MemoryAccessViolation整個應用程序(SIGSEGV在Linux中)

我的應用程序每次調用此插入文本到TreeView,以便我可以永遠關閉(您正在插入文本到某個窗口,並且你想看到最新的文字,就像在聊天中一樣)

文本只從主線程插入,這個函數也是隻在主線程中調用的,所以在我自己的應用程序中這不能和多線程相關,但是我發現了TextView正在與其餘應用程序異步渲染文本。就像負責繪製和處理文本的線程不是真正的主線程一樣。例如,如果我將大文本加載到TextView中,即使TextView以某種方式加載文本,我的應用程序也會響應。

爲此,我認爲,TextView的實際上是與自己的獨立的線程工作,並且此線程更改文本,因爲我試圖滾動窗口。文本被改變的無效ITER之間某處所以在我傳遞richTextBox.Buffer.EndIter到TextView的ScrollToBottom IL代碼功能的文本是由這個外國線程可能發生變化,ITER是無效的,這就是爲什麼我得到這個存儲器存取例外。

這可能是GTK甚至是錯誤的,但我使用非常穩定的版本(2.1.20)隨機附帶的所有單版本,直到mono3,甚至所有的Windows GTK#版本。

是否有任何其他的方式來向下滾動「安全」

回答

4

這似乎工作:

連接的是滾動到SizeAllocated事件功能:

this.tv.SizeAllocated += new SizeAllocatedHandler(Scroll2); 

滾動

創建功能
public void Scroll2(object sender, Gtk.SizeAllocatedArgs e) 
{ 
    tv.ScrollToIter(tv.Buffer.EndIter, 0, false, 0, 0); 
} 

我不知道它是否正確,但它到目前爲止並沒有對我造成影響,並且一旦完成渲染,它總是滾動到底部