0

Hi i have a Sub that has multiple if statements in it. Each if statement has a large loop that searches for specific files and text inside files. I tried various ways to use a text box in order to get the information which if is currently proccessing at the time and i see that for some reason the ui is not refreshed until the sub finishes and so i see everytime in the textbox the last proceesed if message. What do you think is the best way to handle it? I hope that this has nothing to do with threads because threads are something that i am not familiar with !

Ted Kon
  • 87
  • 1
  • 6
  • This is because you are performing the operation on the UI thread. You need to separate the longer running operation into it's own task or thread. I'll just find a decent guide for you, one moment – Martin Jul 06 '21 at 07:59
  • This article outlines the concept reasonably well: https://social.technet.microsoft.com/wiki/contents/articles/33280.vb-net-invoke-method-to-update-ui-from-secondary-threads.aspx – Martin Jul 06 '21 at 08:00
  • 2
    This is also a useful guide to using a BackgroundWorker to achieve a similar outcome: https://thedeveloperblog.com/vbnet/backgroundworker-vbnet – Martin Jul 06 '21 at 08:02

2 Answers2

0

I think using Application.DoEvents() is an easy choice. But I don't know if that would be the desired behavior. If the use of Application.DoEvents() fails, another thread should handle it.

https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.application.doevents?view=netframework-3.5

Think2826
  • 201
  • 1
  • 7
  • 2
    In general, it is recommended not to use `DoEvents()` apart from in specific circumstances. See [here](https://stackoverflow.com/a/5183623/2169762) and the caution box at the end of [this](https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.application.doevents) – Martin Jul 06 '21 at 08:14
  • @Martin as i understand i have to use such backround workers as much are my if statements right ? – Ted Kon Jul 06 '21 at 08:40
  • @TedKon I would suggest that any non-UI code should be separate (although this will sometimes depend upon the delay to run that code). A background worker is one way of achieving it. Or a Thread, or a Task, and there are others – Martin Jul 06 '21 at 08:53
0

I use this:

Public Sub logWithCrLf(tx As TextBox, s As String)
    tx.AppendText(s & vbCrLf)
    tx.Select(tx.TextLength - 1, 0)
    tx.ScrollToCaret()
    tx.Refresh()
End Sub

I see that it scrolls a bit smoother using tx.AppendText(s) than tx.Text &= s, which scrolls up to 0 then down to caret again.

(I write this as an answer to contribute with the tx.AppendText() recommendation)

Ivan Ferrer Villa
  • 2,129
  • 1
  • 26
  • 23
  • 1
    `AppendText` already scrolls by itself, so you don't need the three lines below it. Do favor `Environment.NewLine` over `vbCrLf` – LarsTech Jul 18 '22 at 19:50