Visual Basic .NET - stop program from freezing during function execution

I have a program that is going to open JPEG files in a directory and analyze them (it analyzes the color content) and updates a textbox with some information.  As the program is looping through the JPEG files, I've used the System.Windows.Forms.Application.DoEvents() method so that the output is sent to the textbox as the program is looping through the files.  My question is, how do I stop the entire program from freezing.  When the loop is running, I cannot move the form window or click any other buttons on the form.  Keep in mind that i'm a programming beginner, so I need some hand-holding to help me out.
olinccuAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Éric MoreauSenior .Net ConsultantCommented:
You will need to use threading which can be an advance topic for you.

Maybe you can start with the BackgroundWorker component which is a wrapper to ease threading.

Have a look at http://www.emoreau.com/Entries/Articles/2006/12/The-BackgroundWorker-component.aspx
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
FragReaperCommented:
Add a new module and run the function in a new thread. But you can't pass variables to a function in a new thread, so you put it in a new class.
Imports System.IO
 
Public Class NewThread
Private InformationReturned as string 
Private PathToJpeg as string 'This is how we will pass information to and from the function
 
Public Event Done(ByVal result as string) ' this is the event that will run on the thread being completed
 
Public WriteOnly Property PassedPathToJpeg() as string
Set(ByVal PassedPathToJpeg As String)
PathToJpeg = PassedPathToJpeg 
End Set
End Property
 
Public ReadOnly Property  PassedInformationReturned() as string
Set(ByVal InformationReturned as String)
PassedInformationReturned = InformationReturned
End set
End Property
 
(Your function goes here)
 
Private Sub NewThread_Done() Handles Me.Done
'to be executed on function completion in new thread
End sub
End class
 '''''''''
 
'And then in your main thead code:
 
Sub CallNewThread()
        Dim oThread As System.Threading.Thread
        Dim oProcess As New MultiThread
oThread = New Thread(AddressOf oProcess.NewThreadWorkings)
                oProcess.pathtojpeg = ' your path
                oThread.Priority = ThreadPriority.' Priority
                oThread.Start()
End Sub

Open in new window

0
KraevenCommented:
The easy way is :

In the sub/function/event that would call the function (remove the function call) that starts to loop through the jpg's and call an other sub like this one :


Private Sub StartProcessingThread()
Dim t as new threading.thread(addressof StartThread)
t.start()
end sub
 
Private sub StartThread()
dim InfoToTextBox as string
'here goes your code processing the jpg's
...
...
'fill in the var InfoToTextbox with whatever info you want to display in the textbox
'for instances
infoToTextbox = "JPG processed..."
 
'call sub to update progress
updateprogress(infoToTextbox)
End sub
 
'Delegate needed to access controls across threads
Private Delegate Sub ChangeTextbox1Callback(ByVal log As String)
 
  Public Sub updateprogess(ByVal log As String) handles me.done
        If Textbox1.InvokeRequired Then
  ' instantiate the callback instance out of this very method
     Dim callback As New ChangeTextbox1Callback(AddressOf updateprogess)
 
     ' invoke it, when it comes to it again InvokeRequired will be false
            Me.Invoke(callback, New Object() {log})
          Else
            'display text in textbox
             Textbox1.text = textbox1.text + vbcrlf + log
        End If
    End Sub

Open in new window

0
KraevenCommented:
Sorry messed up previous post...
Ignore it please

The easy way is :

In the sub/function/event that would call the function (remove the function call) that starts to loop through the jpg's and call an other sub like this one :

Private Sub StartProcessingThread()
Dim t as new threading.thread(addressof StartThread)
t.start()
end sub

Private sub StartThread()
dim InfoToTextBox as string
'here goes your code processing the jpg's
...
...
'fill in the var InfoToTextbox with whatever info you want to display in the textbox
'for instances
infoToTextbox = "JPG processed..."

'call sub to update progress
updateprogress(infoToTextbox)
End sub

'Delegate needed to access controls across threads
Private Delegate Sub ChangeTextbox1Callback(ByVal log As String)

  Public Sub updateprogess(ByVal log As String)
        If Textbox1.InvokeRequired Then
            ' instantiate the callback instance out of this very method
            Dim callback As New ChangeTextbox1Callback(AddressOf updateprogess)

            ' invoke it, when it comes to it again InvokeRequired will be false
            Me.Invoke(callback, New Object() {log})
          Else
            'display text in textbox
             Textbox1.text = textbox1.text + vbcrlf + log
        End If
    End Sub
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft Development

From novice to tech pro — start learning today.