设为首页收藏本站

SKY外语、计算机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3583|回复: 3

继续vb2008实现多线程的挂起和继续

[复制链接]

9

主题

0

好友

104

积分

版主

Rank: 7Rank: 7Rank: 7

生肖
星座
狮子座
性别
发表于 2013-11-26 11:29:40 |显示全部楼层
作者:SKY晓夜 日期:2013-11-26 原文地址:http://www.skywj.com/thread-9446-1-1.html

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

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

分别使用

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

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

9

主题

0

好友

104

积分

版主

Rank: 7Rank: 7Rank: 7

生肖
星座
狮子座
性别
发表于 2013-11-26 11:30:49 |显示全部楼层
本帖最后由 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
回复

使用道具 评分 举报

9

主题

0

好友

104

积分

版主

Rank: 7Rank: 7Rank: 7

生肖
星座
狮子座
性别
发表于 2013-11-26 11:33:10 |显示全部楼层
主要红色代码,Mr.WaitOne() 位置可以自己调整来看效果,这里给出两个位置,供给调试。
回复

使用道具 评分 举报

200

主题

3

好友

2253

积分

管理员

Rank: 9Rank: 9Rank: 9

性别
保密

热心会员 推广达人 宣传达人 灌水之王 突出贡献 优秀版主 荣誉管理 论坛元老 最佳新人 活跃会员

发表于 2013-12-16 17:12:37 |显示全部楼层
不错,以后多发这种技术贴!
回复

使用道具 评分 举报

您需要登录后才可以回帖 登录 | 立即注册


手机版|SKY外语计算机学习 ( 粤ICP备12031577 )    

GMT+8, 2024-4-19 08:41 , Processed in 0.155300 second(s), 29 queries .

回顶部