Jak dopisać treść do TextBoxa, aby działało to optymalnie i szybko?

0

Witam.
Mam pewną funkcję w aplikacji która praktycznie co sekundę zmienia wartości w RichTextBox, dopisując wartości w pętli ...

 Dim linijka As String = "przykladowy_wpis"
For i = 1 to 100000
 RichTextBox2.Text = RichTextBox2.Text + String.Join(vbNewLine, linijka) + Chr(13) + Chr(10)
Next

Niestety przy wielu tysiącach wykonaniach tej pętli, program się zawiesza....i "nie odpowiada". Czy jest jakaś możliwość "dopisywania" treści, która byłaby "szybsza" i lżejsza dla aplikacji ?

0

Można do zadanie zrealizować w nowym wątku. To znaczy nowy wątek odpowiedzialny byłby za dopisywanie kolejnej linii do obiektu RichTextBox.

0

czy jest to jedyne sensowne rozwiązanie?

i czy działanie wątkowe nie wymaga przebudowy całej aplikacji ? (tak aby działała na wielu wątkach) - gdyż nie miałem doświadczenia jeszcze z wątkami.

0

Użyj StringBuilder i wydziel do osobnego wątku.

1

to ani jedyne ani sensowne rozwiązanie - kto proponuje dodawanie nowej linii do kontrolki zrealizować przez nowy wątek???

A pytaczowi polecam na następny raz dokumentację najpierw https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.textboxbase.appendtext(v=vs.110).aspx

0

Czyli rozumiem że coś takiego zrobić?

Dim linijka As String = "przykladowy_wpis"
Dim x as New System.Text.StringBuilder
For i = 1 to 100000
x.Append(vbNewLine + linijka + Chr(13) + Chr(10))
Next

 RichTextBox2.Text = x

I jak to włożyć do wątku ?

0
  abrakadaber , proponujesz zwyczajnie użyć takiej linijki ?

Ale to nadal nie daje dobrego efektu....dopisywanie do RichTextBoxa zawiesza aplikacje i trwa mozolnie długo..

  RichTextBox2.AppendText(linijka + Chr(13) + Chr(10))
1

Dobra, po pierwsze. Jeśli już naprawdę chcesz/musisz robić to w wątku głównym, to musisz się zatroszczyć, żeby po każdej iteracji ruszyła pętla komunikatów. Pewnie nie wiesz, czym jest pętla komunikatów, więc jeśli jesteś ciekawy, to poszukaj sobie w necie. Do tego służy metoda: Application.DoEvents() (https://msdn.microsoft.com/pl-pl/library/system.windows.forms.application.doevents(v=vs.110).aspx)

Spowoduje ona, że okienko będzie odpowiadało na jakieś tam zdarzenia - czyli aplikacja Ci się nie będzie zawieszała.

Żeby to zrobić szybciej, użyj metod BeginUpdate i EndUpdate. Przy czym zaznaczam, że nie wiem, czy te metody występują w tej klasie. A robią to, że po beginUpdate, kontrolka nie jest w ogóle odświeżana. Nie musi być odświeżana przy każdej iteracji, bo i tak tego nie zobaczysz. A odświeżanie jakiś czas zajmuje. BeginUpdate dajesz przed rozpoczęciem pętli, a EndUpdate po zakończeniu pętli. Dopiero EndUpdate spowoduje odświeżenie się kontrolki.

1

ten kod

For i = 1 to 100000
x.Append(vbNewLine + linijka + Chr(13) + Chr(10))
Next

to NIE JEST dodawanie co sekundę tylko ciurkiem, które BLOKUJE formę aż do końca pętli!

0

@Juhas standardowo nie ma tych metod (BeginUpdate i EndUpdate) ale można zrobić w C# trzeba by to przerobić na VB .NET:
http://stackoverflow.com/questions/9418024/richtextbox-beginupdate-endupdate-extension-methods-not-working

0

Żadnych wątków, tylko StringBuilder, albo np. AppendText.
A przede wszystkim zastanowić się, po co użytkownik ma widzieć miliony linijek w textboxie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1