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

相关文章
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
49 1
C++ 多线程之初识多线程
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
20 3
|
2月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
19 2
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
32 2
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
36 1
|
2月前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
38 1
|
2月前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
28 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
56 6