开发者社区> 技术小胖子> 正文

VB无所不能之七:VB的多线程(2)

简介:
+关注继续查看
        久违啦,我今天终于又可以写博客了,VB无所不能这个系列写作途中总是磕磕绊绊的,终于写到第七篇多线程的时候,中断了长达1个多月的时间没有更新新帖,对大家说声抱歉,由于本人这个月遇到很多棘手之事情,没有顾得上。
        好了,言归正传了,继续我们的VB无所不能之旅。
 
        上一篇我们在《VB多线程(1)》中给大家介绍了在VB中使用多线程的两个函数,一个是“CreateThread ”另一个是“Sleep”,这两个是使用多线程时用到的Windowskernel32提供的API函数。
        那么,本篇将具体用一个实例说明一下这两个函数是如何使用的。
 
        我们上文提到,“VB的大部分控件都不是线程安全的”,因此,没有使用我们很熟悉的Text控件,我们为了完成本程序需要用到GDI函数绘图来实现多线程实现部分。
        我们会用到如下GDI函数,其声明及说明如下:
 
获取窗体句柄的DC:
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

设置绘制区域的背景色,也起清除作用:
Public Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long

输出文本:
Public Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long

释放资源:
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
 
好,那么,我们开始建立程序:
 
步骤一:建立一个Module添加如下代码:
 
Declare Function GetDC Lib "user32" () Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long 
Declare Function SetBkColor Lib "gdi32" () Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long 
Declare Function TextOut Lib "gdi32" Alias "TextOutA" () Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long 
Declare Function ReleaseDC Lib "user32" () Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc AsLong) As Long 

Declare Function CreateThread Lib "kernel32" () Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long 

Declare Sub Sleep Lib "kernel32" () Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

'全局的form的句柄! 
Public formhandle As Long 

OutText1() OutText1()    '过程一 
        Dim i As Long 
        Dim dc As Long 
        Dim s As String 
                dc = GetDC(formhandle) '获取窗体句柄的DC 
                For i = 1 To 100000 
                        s = CStr(i) 
                        Call SetBkColor(dc, &HF0F0F0)    '设置绘制区域的背景色,也起清除作用 
                        Call TextOut(dc, 10, 10, s, Len(s)) '输出文本! 
                        Call Sleep(40) '等待 
                Next 
                Call ReleaseDC(formhandle, dc)    '释放资源! 

End Sub 

OutText2() OutText2()    '和过程一类似 
        Dim i As Long 
        Dim dc As Long 
        Dim s As String 
                dc = GetDC(formhandle) 
                For i = 1 To 100000 
                        s = CStr(i) 
                        Call SetBkColor(dc, &HF0F0F0) 
                        Call TextOut(dc, 10, 80, s, Len(s))    '文本位置改变了 
                        Call Sleep(20) '延时改变了 
                Next 
                Call ReleaseDC(formhandle, dc) 
End Sub
 
步骤二:建立一个窗体,添加如下组件,如图所示:
 
 
步骤三:在窗体中添加如下代码:
 
Sub Command1_Click() Sub Command1_Click() 
         
        '声明了线程ID 
        Dim threadid1 As Long 
        Dim threadid2 As Long 

        Call CreateThread(Null, ByVal O&, AddressOf Module1.OutText1, VarPtr(0), ByVal 0&, threadid1) 
        Call CreateThread(Null, ByVal 0&, AddressOf Module1.OutText2, VarPtr(0), ByVal 0&, threadid2) 
         
End Sub 

Sub Form_Load() Sub Form_Load() 
        '保存窗体句柄全局变量,用于在form 上绘图 
        formhandle = Form1.hwnd 
End Sub
 
好,我们再来看运行效果,如图所示:
 
 
好了,本文实现了一个初步的多线程调用的例子,剩下的事情就请大家八仙过海各显神通了!!
 





 本文转自 useway 51CTO博客,原文链接:http://blog.51cto.com/useway/326200,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
18581 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
15291 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14852 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
36336 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
12967 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
19980 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
27723 0
21115
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载