投稿者 葉月  (社会人) 投稿日時 2009/11/10 07:31:41
マルチスレッドのサンプルです。
Hoge:<数字>
だけをループして表示します。
Button2が押されると、Lable1に終了が表示されて処理が終わります。

フォームには、以下のコントロールを配置してください。
Label×1
Button×2


■サンプル
Public Class Form1

#Region "フィールド"

    ' マルチスレッド用に使うdelegate 
    Private Delegate Sub multi()
    Private thread As multi
    ' クロススレッド対策に使うdelegate 
    Private Delegate Sub crossThreadEvasion()
    ' Hogeクラスを呼び出すインスタンス 
    Private objHoge As Hoge

#End Region


    Public Sub New()
        InitializeComponent()
        objHoge = New Hoge()
    End Sub

    Private Sub Form1_Load(ByVal sender As ObjectByVal e As EventArgs)
        Me.Label1.Text = String.Empty
        Me.Button2.Enabled = False
    End Sub

    ' 処理を開始 
    Private Sub Button1_Click(ByVal sender As ObjectByVal e As EventArgs) Handles Button1.Click
        Me.Button1.Enabled = False
        Me.Button2.Enabled = True

        thread = New multi(AddressOf BackGroundConnect)

        ' 別スレッドで処理を開始し、BackGroundConnectの処理が終了したらEndShowが呼ばれます。 
        ' nullはEndShow(ByVal ar As IAsyncResult)メソッドの引数。 
        ' 平たく言うと、非同期処理で同期を取りたい時に利用します。              
        thread.BeginInvoke(New AsyncCallback(AddressOf EndShow), Nothing)
    End Sub

    ''' <summary> 
    ''' HogeShowを呼び出す。 
    ''' このメソッドは、別スレッドから処理されます。 
    ''' </summary> 
    Private Sub BackGroundConnect()
        objHoge.HogeShow()
    End Sub

    ' 処理を終了 
    Private Sub Button2_Click(ByVal sender As ObjectByVal e As EventArgs) Handles Button2.Click
        objHoge.IsEndLoop = True
    End Sub


#Region "終了処理"

    ''' <summary> 
    ''' 終了処理 
    ''' </summary> 
    Private Sub EndShow()
        Me.Label1.Text = "処理を終了します。"
        Me.Button1.Enabled = True
        Me.Button2.Enabled = False
        objHoge.IsEndLoop = False
    End Sub

    ''' <summary> 
    ''' クロススレッド対策用。 
    ''' endShowメソッドをデリゲート経由でアクセスする。 
    ''' </summary> 
    Private Sub EndShowInvoke()
        Me.EndShow()
    End Sub

    ''' <summary> 
    ''' 終了処理のマーシャリング 
    ''' </summary> 
    ''' <param name="ar">平たく言うと、非同期処理で同期を取りたい時に利用</param> 
    Private Sub EndShow(ByVal ar As IAsyncResult)
        ' Invokeの処理が必要か? 
        If Me.Label1.InvokeRequired Then
            Dim d As New crossThreadEvasion(AddressOf EndShowInvoke)
            Me.Invoke(d)
        Else
            Me.EndShow()
        End If
    End Sub

#End Region

End Class