2012年12月5日 星期三

Multithreading 初體驗


程式長時間執行時想中斷程式,會發現介面完全無法操作,

採用 Multithreading 可以解決這個問題,

以下是簡單的範例  ... 中斷無限迴圈

Imports System.Threading

Public Class Form1
    Dim Thread_A As Thread = Nothing
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Thread_A = New Thread(New ThreadStart(AddressOf Me.ThreadAsub))
        Thread_A.IsBackground = True
        Thread_A.Start()
    End Sub
    Private Sub ThreadAsub()
        Dim c_ID As String
        Dim x As Integer = 0
        c_ID = Thread.CurrentThread.GetHashCode()   ' 這行可取得 Thread ID
        update(c_ID, TextBox1)
        Do Until x = 1
            update("測試字串", TextBox2)    '無限迴圈寫入字串
        Loop
    End Sub

'  因為 Thread_A 跟操作介面是不同的 Thread,無法直接寫入TextBox,
   改採以下的寫法就可以順利運作

    Private Delegate Sub updateX(ByVal MyText As String, ByVal c As Control)

    Private Sub update(ByVal MyText As String, ByVal c As Control)
        If Me.InvokeRequired() Then
            Dim cb As New updateX(AddressOf update)
            Me.Invoke(cb, MyText, c)
        Else
            If c.Name = "TextBox1" Then
                c.Text = MyText
            ElseIf c.Name = "TextBox2" Then
                TextBox2.AppendText(MyText & vbCr)
            End If
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Thread_A.Abort()   ' 中斷程式
    End Sub
End Class