VB多线程详解


   MSDN搜索 ‘单元模型线程’,这里有详细vb使用线程的说明

一、 多线程注意事项:

1 若要终止线程的运行,可以使用下面四种的方法:
  一、线程函数退出循环来返回   (最佳方法 )。
  二、通过调用ExitThread 函数,线程将自行撤消(尽量不要使用这种方法 )。
  三、同一个进程或另一个进程中的线程调用TerminateThread 函数(最好避免使用这种方法 )。
  四、该线程的主进程终止运行(避免使用 )。
  下面将介绍终止线程运行的方法,并且说明线程终止运行时会出现什么情况。
1.1 线程函数返回
  始终都应该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。这是确保所有线程资源被正确地清除的唯一办法。如果线程能够返回,就可以确保下列事项的实现:
1. 在线程函数中创建的所有C + +对象均将通过它们的撤消函数正确地撤消。
2. 操作系统将正确地释放线程堆栈使用的内存。
3. 系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。
4. 系统将递减线程内核对象的使用计数。

二、VB实现多线程简单实例

1、先建立一个窗口,并向窗口中添加两个CommandButton控件和一个Label控件
2、修改Command1的Caption为“开始线程”
3、修改Command2的Caption为“停止线程”

 1 Private Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, _
 2                                                       ByVal dwStackSize As Long, _
 3                                                       ByVal lpStartAddress As Long, _
 4                                                       ByVal lpParameter As Long, _
 5                                                       ByVal dwCreationFlags As Long, _
 6                                                       lpThreadId As Long) As Long
 7 Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
 8 
 9 Private Sub Command1_Click()
10     Dim SendThreadID As Long
11     Dim ClassAddress As Long
12     IsRun = 1
13     CopyMemory ClassAddress, Me, 4
14     Call CreateThread(Null, ByVal 0&, AddressOf Module1.NewThread, ClassAddress, ByVal 0&, SendThreadID)
15 End Sub
16 
17 Private Sub Command2_Click()
18     IsRun = 0
19 End Sub

  然后向工程中添加一个模块 Module1,Module1 代码如下:

 1 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 2 Private Declare Function GetTickCount Lib "kernel32" () As Long
 3 Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
 4 Public IsRun As Long
 5  
 6 Public Function NewThread(ByVal pParam As LongAs Long
 7     Dim lSaveTime As Long
 8     Dim lNowTime As Long
 9     Dim FormObj As Form1
10     Dim i As Long
11     Dim ClassAddress As Long
12     Dim MCount As Long
13     Dim SCount As Long
14     lSaveTime = GetTickCount
15     MCount = 0
16     i = 0
17     ClassAddress = 0
18     CopyMemory FormObj, pParam, 4
19     Do
20         Sleep 3
21         lNowTime = GetTickCount
22         SCount = lNowTime - lSaveTime
23         If SCount > 1000 Then
24             lSaveTime = lNowTime
25             i = i + 1
26             FormObj.Label1.Caption = i & " 秒(线程运行时间)"
27         End If
28     Loop While IsRun = 1
29     CopyMemory FormObj, ClassAddress, 4
30 End Function

  其中使用CopyMemory 这个Windows API应注意:

        1) 在VB中由于没有明确的指针定义,涉及到指针操作是通过API函数copymemory来进行,相对于C等语言来说形式上没有那么严格要求,因此外形上看很不明晰。

        2) 在 VB 中出于安全考虑,不能直接访问内存,但你可以使用 CopyMemory(RtlMoveMemory) 的 API 来复制指定区域的内存。

        3) 其具体声明如下:Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 

Destination 是指向复制目标的指针,可以直接指定为某个变量或是数组(如果是数组应使用 myArray(0) 或是 myArray(n) 来指定覆盖的起点,不能直接使用 myArray),或是使用 ByVal 关键字加内存地址
Source 是复制源的指针,用法与上面一样
Length 是复制的长度,以字节为单位。
        4) VB 6 中没有公开的三个函数:VarPtr,StrPtr,ObjPtr它们分别返回变量、字符串(UNICODE)、对象指针(就是内存地址)
        5)
CopyMemory 只负责复制,不负责分配内存。

参考: 1. VB中有关CopyMemory的若干问题
    2. CopyMemory函数
    3. VB多线程安全退出问题的讨论
    4. Active X多线程问题的讨论
    5. COM多线程原理与应用
    6. VB下多线程机制比较


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM