要进行多线程编程一样离不开对系统 APis 的调用,上面介绍了一些多线程编程的基本 APis,下面将让大家
了解下,这些 APis 的参数,以便我们在进行多线程编程时能够轻而易举的使用他。
1.创建线程
Private Declare Function CreateThread Lib "kernel32" _
(lpThreadAttributes As SECURITY_ATTRIBUTES, _
ByVal dwStackSize As Long, _
lpStartAddress As Long, _
lpParameter As Any, _
ByVal dwCreationFlags As Long, _
lpThreadId As Long) As Long
这是一个标准的创建线程的 API,可以看到,里面的一些参数似乎用起来比较麻烦,那么我们接下来要改造下
Private Declare Function CreateThread Lib "kernel32" _
(ByVal lpThreadAttributes As Long, _
ByVal dwStackSize As Long, _
ByVal lpStartAddress As Long, _
ByVal lpParameter As Long, _
ByVal dwCreationFlags As Long, _
lpThreadId As Long) As Long
好了,现在我们开始了解这些参数。
lpThreadAttributes 表示创建线程的安全属性,NT下有用。
dwStackSize 指定线程栈的尺寸,如果为0则与进程主线程栈相同。
lpStartAddress 指定线程开始运行的地址。
lpParameter 表示传递给某个函数的一个参数
dwCreateFlages 表示是否创建后挂起线程(取值CREATE_SUSPEND),挂起后调用ResumeThread继续执行。
lpThreadId 用来存放返回的线程ID。
每个线程都是一个进程的缩影,他们都有自己独立的栈堆,有自己独立使用的寄存器。
参数中需要特别说明的是 lpStartAddress ,这个参数是新启用线程开始执行的内存地址,这点最重要。
其次,执行函数的参数, CreateThread 只提供一个参数传递给某个函数,所以我们的函数一定也要只做
一个参数(能够符合 StdCall 或者由调用者清除栈堆的语言除外)。
2.中止线程
Private Declare Function TerminateThread Lib "kernel32" _
(ByVal hThread As Long, _
ByVal dwExitCode As Long) As Long
该 APis 我们无需进行参数的修改.
hThread 某个线程的句柄
dwExitCode 基于用户操作的退出码
这种退出线程的方法,我们叫他中止线程,究其原因就是因为,这不是正常的退出方法,相对内部操作起来,这
种方法,更麻烦.
3.退出线程
Private Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode As Long)
这是退出线程的标准方法,可以直接退出某个线程,其中参数 dwExitCode 表示退出码.
相比较 TerminateThread ,此函数不仅实现起来简单,而且其内部操作也更加简明.
4.线程的优先级
Private Declare Function SetThreadPriority Lib "kernel32" _
(ByVal hThread As Long, _
ByVal nPriority As Long) As Long
Private Declare Function GetThreadPriority Lib "kernel32" _
(ByVal hThread As Long) As Long
参数 hThread 表示某个线程的句柄, nPriority 表示要设置的优先级别
线程有五个线程的优先级水平。在进程的优先级确定之后,可以改变线程的优先级水平。
用 SetPriorityClass 设置进程优先级类,用 SetThreadPriority 设置线程优先级水平。
Normal 级的线程可以被除了 Idle 级以外的任意线程抢占。
5.挂起/恢复线程
Private Declare Function SuspendThread Lib "kernel32" _
(ByVal hThread As Long) As Long
参数 hThread 表示某个线程的句柄.当你启用的线程需要暂停一阵,但需要继续准备并在某个时候继续的时候
ResumeThread 和 SuspendThread 就派上了用场.