PROGRAMMING WORKSHOP

Skip Navigation Links. Skip Navigation Links.

.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]***