SKY外语计算机学习

标题: 继续vb2008实现多线程的挂起和继续 [打印本页]

作者: SKY晓夜    时间: 2013-11-26 11:29
标题: 继续vb2008实现多线程的挂起和继续
作者:SKY晓夜 日期:2013-11-26 原文地址:http://www.skywj.com/thread-9446-1-1.html

完成了上一个多线程的例子,但是还纯在一个问题是,怎么使线程挂起和继续,注意这里说的不是停止,停止在上一节中已有演示。

要挂起多线程,vb中没有像vc中那样有直接的函数可以挂起制定线程,vb.net中使用ManualResetEvent类,来实现类似的功能,我姑且把他看做一个信号发射器,可以命令线程的挂起,和继续。

分别使用

Reset()发送挂起信号,挂起线程
set()发送继续信号,继续线程
有发送就有接收端,我们使用WaitOne()来接收这些信号
WaitOne()使用需要一定的技巧,看你放置的位置,主要不要放置在主界面线程。
WaitOne()接收到信号就会再相应的代码处挂起。

二楼上代码,还是使用上一片中的例子,加入两个按钮来实现挂起和继续。

作者: SKY晓夜    时间: 2013-11-26 11:30
本帖最后由 SKY晓夜 于 2013-11-26 11:32 编辑

Imports System.Threading
Public Class Form1
#Region "Shared data"
    Private mMin As Integer
    Private mMax As Integer
    Private mResults As New List(Of Integer)
    Private value As Integer
    Dim Mr As ManualResetEvent = New ManualResetEvent(True)

#End Region
#Region "Primary Thread methods"
    Private Sub btnStrat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStrat.Click
        ProgressBar1.Value = 0
        ListBox1.Items.Clear()
        mMin = 1
        mMax = 10000
        '启动后台线程
        BackgroundWorker1.RunWorkerAsync()
    End Sub
    Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
        BackgroundWorker1.CancelAsync()
    End Sub
    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        '主线程

        ProgressBar1.Value = 100 + (e.ProgressPercentage)
    End Sub
    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        '后台线程完成是显示所有素数
        For Each item As String In mResults
            ListBox1.Items.Add(item)
        Next

    End Sub
#End Region
    '后台计算素数线程
#Region "Background Thread methods"
    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        mResults.Clear()
        For count As Integer = mMin To mMax Step 2
            Dim isPtime As Boolean = True
            For x As Integer = 1 To CInt(count / 2)
                For y As Integer = 1 To x
                    If x * y = count Then
                        isPtime = False
                        Mr.WaitOne()
                        Exit For
                    End If
                Next
                If Not isPtime Then Exit For
            Next
            If isPtime Then
                mResults.Add(count)
            End If
            Me.BackgroundWorker1.ReportProgress(CInt((count - mMax) / (mMax - mMin) * 100))
            If Me.BackgroundWorker1.CancellationPending Then
                Exit For
            End If
        Next
        Mr.WaitOne()   
End Sub

#End Region

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Mr.Reset()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Mr.Set()
    End Sub
End Class
作者: SKY晓夜    时间: 2013-11-26 11:33
主要红色代码,Mr.WaitOne() 位置可以自己调整来看效果,这里给出两个位置,供给调试。
作者: admin    时间: 2013-12-16 17:12
不错,以后多发这种技术贴!




欢迎光临 SKY外语计算机学习 (http://skywj.com/) Powered by Discuz! X2.5