Solved

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

Posted on 2009-07-14
4
679 Views
Last Modified: 2013-11-27
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.
0
Comment
Question by:olinccu
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
4 Comments
 
LVL 70

Accepted Solution

by:
Éric Moreau earned 300 total points
ID: 24850335
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
 
LVL 1

Assisted Solution

by:FragReaper
FragReaper earned 100 total points
ID: 24881515
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
 
LVL 3

Expert Comment

by:Kraeven
ID: 24907217
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
 
LVL 3

Assisted Solution

by:Kraeven
Kraeven earned 100 total points
ID: 24907238
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

Featured Post

Instantly Create Instructional Tutorials

Contextual Guidance at the moment of need helps your employees adopt to new software or processes instantly. Boost knowledge retention and employee engagement step-by-step with one easy solution.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Background What I'm presenting in this article is the result of 2 conditions in my work area: We have a SQL Server production environment but no development or test environment; andWe have an MS Access front end using tables in SQL Server but we a…
I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…

691 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question