Beginner: Thread not starting before UI Thread finishes?

E

Eric Mamet

I am trying to write a Server Component that will spawn a database
task in a thread and wait a certain amount of time for completion.
If, at the end of this time, the job is not complete, I want the
component to report this to the calling code and leave the Thread
finishing the SQL Job.

I tried to emulate this scenario with "Thread.Sleep()" in VB and it
does what I want in a Console Application but not in a Windows
Application.
Could there be something special about Windows Application?

My Console app code is as follows (feel free to use it in your
projects!)

Imports System.Threading

Module Module1

Private _MyThread As Thread
Const MainLoop As Integer = 3
Const ThreadLoop As Integer = 5

Sub Main()
Dim Idx As Integer

_MyThread = New Thread(AddressOf ThreadJob)

Console.WriteLine("Before Launching Thread")
_MyThread.Start()
Console.WriteLine("After Launching Thread")

For Idx = MainLoop To 1 Step -1
Thread.Sleep(1000) ' wait 1 sec
Console.WriteLine("Main Loop...")
Next

If _MyThread.ThreadState = ThreadState.Running Then
Console.WriteLine("Thread is running")
Else
Console.WriteLine("Thread is NOT running")
End If

End Sub

Private Sub ThreadJob()
Dim Idx As Integer

Console.WriteLine("Thread Started")

For Idx = ThreadLoop To 1 Step -1
Thread.Sleep(1000)
Console.WriteLine("Thread Loop")
Next

Console.WriteLine("Thread Finished")
End Sub
End Module

In the Windows app, I also start the Thread before my "Main" Loop but
the thread code only starts after the "Main" Loop finishes.

I was hoping that both threads would run somewhat in parallel.


Thanks


Eric Mamet
 
R

Roy Osherove

I think the problem is that in the GUI app (not the console) you make
your threaded job show statuses using the GUI. It is always
recommended that only the GUI thread talk to any controls on the form.
If a different thread would like to update the form, it should use
"Control.Invoke" to make those updates using the GUI thread.
This will explain a little more:
if you wanted to update a label on the form , just make the thread
call this method:

private delegate void StdDelegateString(string text);

private void ShowSearchStatus(string status)
{
if(this.InvokeRequired)
{
this.Invoke(new StdDelegateString(ShowSearchStatus),new
object[]{status});
return ;
}

lblStatus.Text= status;
}
 
E

Eric Mamet

I had suspected something like it and I tried to raiseevents from my
object but still without much success.

Following your advice, I have removed any UI access of any sort and it
works like a treat.

Many Thanks


Eric
 

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