ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8983|回复: 16

[原创] VS中简单的多线程示例

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-11-19 21:52 | 显示全部楼层 |阅读模式
直接上代码.....0到10亿的累加操作
使用VBA计算耗费27秒 且计算结果由于使用Variant类型而不准确
下面是VB.NET代码
Imports System.Threading
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sum As Long
        Dim t As New Stopwatch
        t.Start()
        For i As Long = 0 To 1000000000
            sum += i
        Next
        t.Stop()
        MsgBox(t.Elapsed.TotalSeconds & vbCrLf & sum)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim t As New Stopwatch
        t.Start()
        Dim sA As New clsTask(0, 250000000)                                    ‘分为4段任务来完成
        Dim sB As New clsTask(250000001, 500000000)
        Dim sC As New clsTask(500000001, 750000000)
        Dim sD As New clsTask(750000001, 1000000000)
        Dim TdA As New Thread(New ThreadStart(AddressOf sA.SumOfNum))
        TdA.Start()
        Dim TdB As New Thread(New ThreadStart(AddressOf sB.SumOfNum))
        TdB.Start()
        Dim TdC As New Thread(New ThreadStart(AddressOf sC.SumOfNum))
        TdC.Start()
        Dim TdD As New Thread(New ThreadStart(AddressOf sD.SumOfNum))
        TdD.Start()
        TdA.Join()                           ’阻塞线程,因为需要4个线程的结果才能得出最终结果
        TdB.Join()
        TdC.Join()
        TdD.Join()
        t.Stop()
        MsgBox(t.Elapsed.TotalSeconds & vbCrLf & sA.r + sB.r + sC.r + sD.r)
    End Sub
End Class
Public Class clsTask
    Sub New(ByVal st As Long, ByVal ed As Long)
        Me.st = st
        Me.ed = ed
    End Sub
    Private st As Long, ed As Long
    Public r As Long
    Public Function SumOfNum() As Long
        r = 0
        For i As Long = st To ed
            r += i
        Next
    End Function
End Class


本机测试结果为:单线程4.2秒   多线程2.7秒

拓展:
摆脱VBA中运算时用户界面无响应的问题
Imports System.Threading
Public Class Form1
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim R As New run
        Dim T As New Thread(New ThreadStart(AddressOf R.runTask))
        T.Start()

        Me.Text = "我已经可以响应用户的操作啦!"
    End Sub
End Class
Public Class clsTask
    Sub New(ByVal st As Long, ByVal ed As Long)
        Me.st = st
        Me.ed = ed
    End Sub
    Private st As Long, ed As Long
    Public r As Long
    Public Function SumOfNum() As Long
        r = 0
        For i As Long = st To ed
            r += i
        Next
    End Function
End Class
Public Class run
    Sub runTask()
        Dim t As New Stopwatch
        t.Start()
        Dim sA As New clsTask(0, 250000000)
        Dim sB As New clsTask(250000001, 500000000)
        Dim sC As New clsTask(500000001, 750000000)
        Dim sD As New clsTask(750000001, 1000000000)
        Dim TdA As New Thread(New ThreadStart(AddressOf sA.SumOfNum))
        TdA.Start()
        Dim TdB As New Thread(New ThreadStart(AddressOf sB.SumOfNum))
        TdB.Start()
        Dim TdC As New Thread(New ThreadStart(AddressOf sC.SumOfNum))
        TdC.Start()
        Dim TdD As New Thread(New ThreadStart(AddressOf sD.SumOfNum))
        TdD.Start()
        TdA.Join()
        TdB.Join()
        TdC.Join()
        TdD.Join()
        t.Stop()
        MsgBox(t.Elapsed.TotalSeconds & vbCrLf & sA.r + sB.r + sC.r + sD.r)
    End Sub
End Class

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-20 19:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-11-21 23:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
支持一下,俺这里也有几个示例,改天不忙时发上来!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-22 10:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
HHAAMM 发表于 2012-11-21 23:58
支持一下,俺这里也有几个示例,改天不忙时发上来!!

期待大作 我还是第一次用多线程 嘿嘿
感觉非常像JAVA的多线程

TA的精华主题

TA的得分主题

发表于 2012-11-22 11:43 | 显示全部楼层
doryan 发表于 2012-11-22 10:09
期待大作 我还是第一次用多线程 嘿嘿
感觉非常像JAVA的多线程

惭愧,我只是抄抄改改

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-22 16:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
HHAAMM 发表于 2012-11-22 11:43
惭愧,我只是抄抄改改

社会主义初级阶段都是这个样子的
模仿-借鉴-了解-熟悉-融会贯通

TA的精华主题

TA的得分主题

发表于 2012-11-23 12:43 | 显示全部楼层
楼主,奇怪我在机子测试你的代码,结果是反过来的

单线程:3.1666

多线程:5.1776

平台:XPSP3,VS2010

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-24 00:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
xmhjfang 发表于 2012-11-23 12:43
楼主,奇怪我在机子测试你的代码,结果是反过来的

单线程:3.1666

你是几核的CPU?
单核的肯定不行 但是看你的运算速度 单线程都那么快哦 表示不怎么理解 CPU多少频率的
或者直接放型号

还有就是你可以试试
项目-属性-生成-目标平台 改成你自己CPU的试试
64位CPU可能会造成这样的结果 不知道是不是这个原因

TA的精华主题

TA的得分主题

发表于 2012-11-24 09:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 xmhjf 于 2012-11-24 09:03 编辑
doryan 发表于 2012-11-24 00:06
你是几核的CPU?
单核的肯定不行 但是看你的运算速度 单线程都那么快哦 表示不怎么理解 CPU多少频率的
...



公司电脑CPU I5支持64位
QQ截图20121124090119.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-24 14:01 | 显示全部楼层
xmhjf 发表于 2012-11-24 09:02
公司电脑CPU I5支持64位

我的也是I5啊
我用的是WIN8而已
你试试把 项目-属性-生成-目标平台
从ANYCPU换成X64 再编译运行
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-4 00:59 , Processed in 0.054170 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表