Solved

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

Posted on 2009-07-14
4
630 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
  • 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

NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Exit a vb6 apps when a calling it apps closes 15 49
MS SQL store procedure to calculate and return result 6 58
TT Auto Dashboard 13 92
Problem to With line 4 57
Introduction While answering a recent question about filtering a custom class collection, I realized that this could be accomplished with very little code by using the ScriptControl (SC) library.  This article will introduce you to the SC library 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…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

831 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