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,如需转载请自行联系原作者

相关文章
|
12天前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
38 1
|
4天前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。
|
12天前
|
监控 安全 Java
Java多线程调试技巧:如何定位和解决线程安全问题
Java多线程调试技巧:如何定位和解决线程安全问题
65 2
【多线程面试题 一】、 创建线程有哪几种方式?
创建线程的三种方式包括继承Thread类、实现Runnable接口和实现Callable接口,其中Runnable和Callable接口方式更受推荐,因为它们允许多重继承并更好地体现面向对象思想。
|
18天前
|
Java 调度
【多线程面试题 五】、 介绍一下线程的生命周期
线程的生命周期包括新建、就绪、运行、阻塞和死亡状态,线程状态会根据线程的执行情况在这些状态之间转换。
【多线程面试题 五】、 介绍一下线程的生命周期
|
20天前
|
Java
多线程线程同步
多线程的锁有几种方式
|
27天前
|
调度 Python
|
30天前
|
安全 算法 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(下)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
58 6