2013-04-16 2 views
1

Я нашел странные аномалии в текстовом виде GTK, надеюсь, кто-то сможет их объяснить.Как я могу автоматически прокручивать донизу в GTK TextView

Существует простая функция для прокрутки в нижней части окна:

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

это, вероятно, должно работать и работать в большинстве случаев. Но иногда это приводит к сбою всего приложения с помощью MemoryAccessViolation (SIGSEGV in linux)

Мое приложение вызывает это каждый раз, когда я вставляю текст в TreeView, чтобы я всегда был вниз (вы вставляете текст в какое-то окно, и вы хотите видеть последний текст, например, в чате)

Текст вводится только из основного потока, и эта функция ТАКЖЕ вызывается только в основном потоке, поэтому это не может быть связано с многопоточным в моем собственном приложении, однако я узнал что TextView передает текст асинхронно с остальной частью приложения. Например, если поток, ответственный за покраску и обработку текста, на самом деле не является основным потоком. Например, если я загружаю огромный текст в TextView, мое приложение отвечает, даже если TextView каким-то образом загружает текст.

По этой причине я считаю, что TextView фактически работает с собственным отдельным потоком, и этот поток меняет текст, когда я пытаюсь прокрутить окно. Измененный текст аннулирует итератор, поэтому где-то между IL-кодом, в котором я передаю richTextBox.Buffer.EndIter функции TextView ScrollToBottom, текст, вероятно, изменен этим внешним потоком, и iter недействителен, поэтому я получаю это исключение доступа к памяти.

Это может быть даже ошибка в GTK, но я использую очень стабильную версию (2.1.20), которая поставляется со всеми моно версиями до mono3 и даже для всех окон 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); 
} 

Я не знаю, если это правильно, но это не ударил меня до сих пор, и он всегда прокручивает вниз, как только рендеринг выполняется

Смежные вопросы