Progress bar update from worker thread

D

dgleeson3

Hello all

Yes I know its been done before, but something silly is killing me on
this.

I have the standard progress bar and worker thread scenario with
progress of the worker thread being fed back to the main UI and
displayed on the progress bar. I have a delegate and am using
BeginInvoke. But the progress bar is not updating.

I have simplified my code below(and also built and tested this code).
Basic form1 with progress bar and button nothing else.
--------------------------------------------------------------------------------------------
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Threading
Imports System.IO


Public Class Form1

Dim worker As System.Threading.Thread ' Thread
Dim worker_obj As New worker_class ' Object from
worker class


Public Sub New()
Me.InitializeComponent()
'ProgressBar1
ProgressBar1.Name = "ProgressBar1"
ProgressBar1.Maximum = 100
ProgressBar1.Value = 10
End Sub

Sub UpdateProgressDisplay(ByVal Value_for_progress_bar As Integer)
ProgressBar1.Value = Value_for_progress_bar
Application.DoEvents()
End Sub


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button1.Click

worker = New Thread(AddressOf
worker_obj.DoRemoteCommunications)

' Now actually start the comms thread.
worker.Start()
End Sub
End Class

Public Class worker_class

' Set up delegate for assync function call.
--------------------------------
Public Delegate Sub Async_Update_Progress_caller(ByVal
Value_for_progress_bar As Integer)


Public Sub DoRemoteCommunications()
Console.WriteLine("Comms worker thread started.....")

' Set up delegate to allow asynchronous calls between threads.
Dim caller As New Async_Update_Progress_caller(AddressOf
Form1.UpdateProgressDisplay)

' Initiate the asynchronous call.
Dim result As IAsyncResult

result = caller.BeginInvoke(100, Nothing, Nothing)
Console.WriteLine("Progress value 25 passed ")
Thread.Sleep(3000)


Console.WriteLine("Comms worker thread Finished.")

End Sub

End Class

--------------------------------------------------------------------------------------------


Many thanks for any help.

Denis
_______________________
http://www.CentronSolutions.com
 
M

Mattias Sjögren

I have the standard progress bar and worker thread scenario with
progress of the worker thread being fed back to the main UI and
displayed on the progress bar. I have a delegate and am using
BeginInvoke. But the progress bar is not updating.

You should use Control.BeginInvoke on a control or form, not
Delegate.BeginInvoke.



Mattias
 
D

dgleeson3

Hi Mattias

Thanks for your help.

Ok Im not familiar with control.begininvoke.

Ive changed the worker class as below using

Form1.ProgressBar1.BeginInvoke(caller)

Now Im getting the following run time error.
"Invoke or BeginInvoke cannot be called on a control until the window
handle has been created."

But Form1.ProgressBar1 is on the form. Im confused.

--------------------------------------------------------------------------------------------------

Public Class worker_class

' Set up delegate for assync function call.
--------------------------------
Public Delegate Sub Async_Update_Progress_caller(ByVal
Value_for_progress_bar As Integer)


Public Sub DoRemoteCommunications()
Console.WriteLine("Comms worker thread started.....")

' Set up delegate to allow asynchronous calls between threads.
Dim caller As New Async_Update_Progress_caller(AddressOf
Form1.UpdateProgressDisplay)

' Initiate the asynchronous call.
Dim result As IAsyncResult

result = Form1.ProgressBar1.BeginInvoke(caller)
Console.WriteLine("Progress value 25 passed ")
Thread.Sleep(3000)


Console.WriteLine("Comms worker thread Finished.")

End Sub

End Class
----------------------------------------------------------------------------------------------------------



Thanks for your help

Denis
 
P

Phill W.

Have you come across the BackgroundWorker class yet? (new to Framework
2.0, IIRC). It is specifically designed for this situation, marshaling
events from the worker thread back onto the UI thread and getting round
all these marshaling problems.

HTH,
Phill W.
 
S

surturz

I've not really mucked around with threads much, but why not just use
..DoEvents within the processing loop?

-SurturZ
 
R

Rick Gatewood

I am having the same problem. I cannot update the progress bar. How does one
use control.begininvoke? Do I need to create another delegate which ties in
directly to the control? If so, does anyone know how to do this? Please help.

Hi Mattias

Thanks for your help.

Ok Im not familiar with control.begininvoke.

Ive changed the worker class as below using

Form1.ProgressBar1.BeginInvoke(caller)

Now Im getting the following run time error.
"Invoke or BeginInvoke cannot be called on a control until the window
handle has been created."

But Form1.ProgressBar1 is on the form. Im confused.

--------------------------------------------------------------------------------------------------

Public Class worker_class

' Set up delegate for assync function call.
--------------------------------
Public Delegate Sub Async_Update_Progress_caller(ByVal
Value_for_progress_bar As Integer)


Public Sub DoRemoteCommunications()
Console.WriteLine("Comms worker thread started.....")

' Set up delegate to allow asynchronous calls between threads.
Dim caller As New Async_Update_Progress_caller(AddressOf
Form1.UpdateProgressDisplay)

' Initiate the asynchronous call.
Dim result As IAsyncResult

result = Form1.ProgressBar1.BeginInvoke(caller)
Console.WriteLine("Progress value 25 passed ")
Thread.Sleep(3000)


Console.WriteLine("Comms worker thread Finished.")

End Sub

End Class
----------------------------------------------------------------------------------------------------------



Thanks for your help

Denis
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top