Multithreading

  • Thread starter Thread starter Michael
  • Start date Start date
M

Michael

I have an application that monitoring some directories.
When new file arrives my application importing that file into database (very
long process)
I want to rewrite this application to multithread application so if multiple
files arrive at the same time the directory monitor should start new thread
for each file . I don't need any feedback from importing routine (all
information about flow stored into log file).

I am looking for some samle application that have similar functionality or
some online tutorial / article on this subject.

Also I have a question:
What happens to class/method that run on separate thread if starting
applications closed?

Thanks you,

Michael
 
I would create a seperate class to do the import. You will then need to
create some properties in the class for the filename to import etc as you
can't pass these to the thread easily when calling the function...

So for example:

Public Class myFileImport
Dim _Filename as string
Public Property FileName as string
Get
return _FileName
End Get
Set (ByVal Value as string)
_FileName=Value
End Set
End Property
Public Sub ImportFile()
' Put your import code here
End Sub
End Class


Then in your main routine, create the thread as follows:

Dim myFunction as new myFileImport()
Dim mythread as new threading.thread(addressof myFunction.ImportFile)
mythread.start

Hope this helps
Simon
 
Thanks Simon

This is exactly what I need.
But my question is still open:
What happens with myFileImport Class when my Main Class ends?
I guess that a new thread will continue to work without any problem, am I
right?


Michael
 
No..

If your main application stops, all the threads die with it...


Regards
Simon
 
Ok. Looks like I do need feedback to notice that process is finished and
main application is safe to close.
How can I do that? Fire events?
 
Depends on if you've got a finite no of threads...

Michael said:
Ok. Looks like I do need feedback to notice that process is finished and
main application is safe to close.
How can I do that? Fire events?

In my application, I have a finite no, so I use a collection to store the threads in...

so, I define the collection as a module level variable as:

Dim runningThreads as new collection

Then each time I start a thread up... I add

runningthreads.add(mythread)

to add it to the collection (this goes just before the mythread.start line).


Then you can check that all the threads have closed by enumerating through them and checking the threadstate property... ie..

Dim t as thread
For Each t In runningthreads
If t.ThreadState <> Threading.ThreadState.Stopped Then
' Thread is still running
End if


I suppose you could take care of the fact that you have an ever growing no of threads by tidying them up in a timer.... eg create a timer to run every thirty seconds and then put code like this in the timer:

Dim t as thread
Dim cnt as int32=0
for each t in runningThreads
if t.threadstate=threading.threadstate.stopped then
runningthreads.remove(cnt)
end if
cnt+=1
next


This will remove the completed threads from your collection. There are other more elegant ways of doing this I'm sure - for example, encapsulating the whole thread collection in a class, but I think it will work just fine for you.

Hope this helps

Regards
Simon
 
Yes, I want to limit processing treads to number but with ability to change that number dynamicaly (.config file or database)
I think about this approach:

If _NumOfThreads< MAX_NUM_OF_THREADS Then
Dim myFunction as new myFileImport()
Dim mythread as new threading.thread(addressof myFunction.ImportFile)
mythread.start
_NumOfThreads +=1
End If


Private Sub SomeFeedbackFunction() Handles ????
_NumOfThreads -=1

End Sub


How to implement feedback?
In VB6 I used to use notification class. Something like that:

Class Notify

Public Event ThreadFinished()

Public Sub OnThreadFinish()

RaiseEvent ThreadFinished

End Sub


End Class


In main application I declare this class with events, create an instance and pass a reference to child Class (in this case to the class in the new thread):

When New Thread is about to finish his job it calls to objNotify.OnThreadFinish

In main App objNotify fires an event.

Will it work with multithreading and VB.net?


Thank you Michael



Depends on if you've got a finite no of threads...

Michael said:
Ok. Looks like I do need feedback to notice that process is finished and
main application is safe to close.
How can I do that? Fire events?

In my application, I have a finite no, so I use a collection to store the threads in...

so, I define the collection as a module level variable as:

Dim runningThreads as new collection

Then each time I start a thread up... I add

runningthreads.add(mythread)

to add it to the collection (this goes just before the mythread.start line).


Then you can check that all the threads have closed by enumerating through them and checking the threadstate property... ie..

Dim t as thread
For Each t In runningthreads
If t.ThreadState <> Threading.ThreadState.Stopped Then
' Thread is still running
End if


I suppose you could take care of the fact that you have an ever growing no of threads by tidying them up in a timer.... eg create a timer to run every thirty seconds and then put code like this in the timer:

Dim t as thread
Dim cnt as int32=0
for each t in runningThreads
if t.threadstate=threading.threadstate.stopped then
runningthreads.remove(cnt)
end if
cnt+=1
next


This will remove the completed threads from your collection. There are other more elegant ways of doing this I'm sure - for example, encapsulating the whole thread collection in a class, but I think it will work just fine for you.

Hope this helps

Regards
Simon
 
Back
Top