.Net FrameWork,VB.Net | Thread을 위한 집합체와 Class 모듈의 활용
앞페이지에서 4개의 Thread를 만들어서 실행을 시키려고
아래와 같이 Thread마다 개체를 선언하였었다
Dim oThread1 As Threading.Thread
Dim oThread2 As Threading.Thread
Dim oThread3 As Threading.Thread
Dim oThread4 As Threading.Thread
좀 무식한 짓이라고 생각하시면 되겠다..
4개가 아니라 40개가 필요하다고 한다면 일일이 이것을 이렇게 선언하겠는가???
여러개가 모였으니, 집합체(혹은 배열)이다
집합체을 다루기 위한 자원이 VB.Net에서는 엄청 풍부하다
이것을 좀 활용해 나가 보면서 VB.Net에서의 집합체에 익숙하도록 하자
아래와 같이 집합체를 하나 선언하고 위의 것을 모두 잡아 넣도록 하자
Public oThreadList As New ArrayList
그러기 위하여서는 Thread를 다루는 크래스모듈을 하나 만들어서 사용하는 것이
편리해진다
VB.Net은 항상 크래스모듈을 즐겨 사용할준비가 되어 있어야 코딩이 점점 편리해진다
편리해진다고 하는 것은 중복되는 코딩을 한곳에 한번만 작성하면
Thread를 10개를 만들던 100개를 만들던 코드는 단순해지게 된다
아래와 같이 크래스모듈을 만든다
Public Class clsMyThread
''몇번째 버튼에서 실행시킨 Thread인지 기억하고 있도록 하고
Private mThreadIndex As Integer
''몇번째 실행되고 있는지의 정보를 기억하고
Private mCounter As Integer = 0
''생성할때 전달받은 매개변수 2개를 보관할 Object타입 배열
''배열요소의 타입이 다르니까 범용으로 Object 타입
Private mArgs(1) As Object
''호출할때 전달받은 폼개체
Private mMainWindow As Form
''Thread가 1씩증가하는 작업을 하면서 발생한 정보를 폼에 전달하기 위한 Delegate
Private Delegate Sub NotifyMainWindow(ByVal ThreadIndex As Integer, ByVal Counter As Integer)
''위의 Delegate크래스로 생성할 개체
Private mNotifyMainWindow As NotifyMainWindow
Public Sub New(ByVal ThreadIndex As Integer, ByRef MainWindow As Form1)
mThreadIndex = ThreadIndex
mMainWindow = MainWindow
'Delegate타입개체가 참조할 폼의 프로시져
mNotifyMainWindow = AddressOf MainWindow.ReceiveThreadMessage
End Sub
Public Sub StartThread()
'' 순환문..무환순환으로 걸어 놓고
'' 폼에서 Thread개체의 Abort메소드로 중단한다
While True
mCounter = mCounter + 1
ReDim mArgs(1)
mArgs(0) = mThreadIndex
mArgs(1) = mCounter
'Invoke메소드는 폼이 갖고 있는 메소드이므로,
'폼을 정식으로 경로에 넣어야 한다
'지난 화일에서 그냥 Invoke를 사용한 것은 폼의 크래스에서 사용하였던 것이므로 생략하였던 것이고
mMainWindow.Invoke(mNotifyMainWindow, mArgs)
Threading.Thread.Sleep(100)
End While
End Sub
End Class
폼크래스에서
위의 크래스모듈로 Thread를 위한 개체를 만들고 사용하면 된다
***[LOG-IN]***