Holey_yan

[VB.NET] ThreadExample

Jan 23rd, 2016
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 4.07 KB | None | 0 0
  1. Public Class Form1
  2.  
  3.     ' 表示欲尋找質數的範圍
  4.     Const FinfNumberRange As Integer = 100000
  5.  
  6.     ' 這是一個用來找在 FinfNumberRange 的數值範圍內最大的質數的程式
  7.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  8.         ' 建立尋找執行緒
  9.         Button1.Text = "Start"
  10.         ' 顯示目前找到的最大質數
  11.         Label1.Text = "Max is : "
  12.         ' 設定 ProgressBar1
  13.         ProgressBar1.Maximum = FinfNumberRange
  14.         ProgressBar1.Minimum = 0
  15.         ProgressBar1.Value = 0
  16.         ' Label2 表示目前 ProgressBar1 所跑到的質
  17.         Label2.Text = String.Empty
  18.     End Sub
  19.  
  20.     ' 建立一條執行緒
  21.     Private thread As Threading.Thread
  22.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  23.         ' 若是按下 Start
  24.         If String.Equals(Button1.Text, "Start") Then
  25.             ' 改變 Button 文字為 Stop
  26.             Button1.Text = "Stop"
  27.             ' 設定執行緒
  28.             thread = New Threading.Thread(AddressOf CheckNumber)
  29.             ' 啟用執行緒
  30.             thread.Start()
  31.  
  32.         Else ' 若為按下 Stop
  33.             Button1.Text = "Start"
  34.  
  35.             ' 強制結束執行緒
  36.             Try
  37.                 thread.Abort()
  38.             Catch ex1 As Threading.ThreadAbortException
  39.             Catch ex2 As NullReferenceException : End Try
  40.         End If
  41.  
  42.         '' 這是用來測試
  43.         '' 如果這樣的功能直接執行和使用執行緒差異在哪裡
  44.         'For i As Integer = 2 To FinfNumberRange Step 1
  45.         '    For j As Integer = 2 To i Step 1
  46.         '        If i Mod j = 0 Then
  47.         '            Label1.Text = "Max is : " & i
  48.         '        End If
  49.         '    Next
  50.         '    ProgressBar1.Value += 1
  51.         'Next
  52.     End Sub
  53.  
  54.     ''' <summary>
  55.     ''' 檢查由 2 到 FinfNumberRange 內的數值是否為質數
  56.     ''' </summary>
  57.     ''' <remarks></remarks>
  58.     Private Sub CheckNumber()
  59.         For i As Integer = 2 To FinfNumberRange Step 1
  60.             Select Case ReturnPrimeNumber(i)
  61.                 Case True ' 若為質數
  62.                     IsPrimeNumberSub(i)
  63.  
  64.                 Case False ' 若不為質數
  65.                     IsNotPrimeNumberSub()
  66.             End Select
  67.         Next
  68.     End Sub
  69.  
  70.     ''' <summary>
  71.     ''' 會檢測傳入的數值是否為質數,並以 Boolean 數值回傳結果
  72.     ''' </summary>
  73.     ''' <param name="value">欲檢測的數值</param>
  74.     ''' <returns>True 表示為質數,False 表示為非質數</returns>
  75.     ''' <remarks></remarks>
  76.     Private Function ReturnPrimeNumber(ByVal value As Integer) As Boolean
  77.         For i As Integer = 2 To value - 1 Step 1
  78.             If (value Mod i = 0) Then
  79.                 Return False
  80.             End If
  81.         Next : Return True
  82.     End Function
  83.  
  84.     ''' <summary>
  85.     ''' 當檢測的數值為質數時
  86.     ''' </summary>
  87.     ''' <param name="value">為質數的數值</param>
  88.     ''' <remarks>因為有對 UI 做操作所以要實作委派</remarks>
  89.     Private Delegate Sub IsPrimeNumberCallBack(ByVal value As Integer)
  90.     Private Sub IsPrimeNumberSub(ByVal value As Integer)
  91.         If Me.InvokeRequired Then
  92.             Dim ipncb As New IsPrimeNumberCallBack(AddressOf IsPrimeNumberSub)
  93.             Me.Invoke(ipncb, value)
  94.         Else
  95.             Label1.Text = "Max is : " & value
  96.             ProgressBar1.Value += 1
  97.             Label2.Text = ProgressBar1.Value
  98.         End If
  99.     End Sub
  100.  
  101.     ''' <summary>
  102.     ''' 當檢測的數值非質數時
  103.     ''' </summary>
  104.     ''' <remarks>因為有對 UI 做操作所以要實作委派</remarks>
  105.     Private Delegate Sub IsNotPrimeNumberCallBack()
  106.     Private Sub IsNotPrimeNumberSub()
  107.         If Me.InvokeRequired Then
  108.             Dim inpncb As New IsNotPrimeNumberCallBack(AddressOf IsNotPrimeNumberSub)
  109.             Me.Invoke(inpncb)
  110.         Else
  111.             ProgressBar1.Value += 1
  112.             Label2.Text = ProgressBar1.Value
  113.         End If
  114.     End Sub
  115. End Class
Advertisement
Add Comment
Please, Sign In to add comment