我在GTK textview中发现了奇怪的异常,希望有人可以解释它们。
有一个简单的功能可以滚动到窗口底部:
richTextBox.ScrollToIter(richTextBox.Buffer.EndIter, 0, true, 0, 0);
这可能应该在大多数情况下起作用。但有时它会使用MemoryAccessViolation(Linux中的SIGSEGV)崩溃整个应用程序
每次我向TreeView插入文本时,我的应用程序都会调用此方法,以便我可以始终关闭(您正在向某个窗口插入文本,并且您希望查看最新文本,例如在聊天中)
该文本仅从主线程插入,此函数仅在主线程中调用,因此这与我自己的应用程序中的多线程无关,但我发现TextView与其余部分异步呈现文本应用。就像负责绘制和处理文本的线程不是真正的主线程一样。例如,如果我将一个巨大的文本加载到TextView中,我的应用程序就会响应,即使TextView以某种方式加载文本。
由于这个原因,我认为TextView实际上是使用自己独立的线程,并且当我尝试滚动窗口时,此线程正在更改文本。正在更改的文本使iter无效,因此介于IL代码中我将richTextBox.Buffer.EndIter
传递给TextView ScrollToBottom函数之间的文本可能会被此外部线程更改并且iter无效,这就是我获得此内存访问异常的原因
这可能是GTK中的一个错误,但我使用的是非常稳定的版本(2.1.20),所有单声道版本都附带,直到mono3,甚至是所有windows gtk#版本。
还有其他方法可以“安全地”向下滚动
答案 0 :(得分: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);
}
我不知道它是否正确,但它到目前为止并没有崩溃,一旦渲染完成它总是滚动到底部