可以实现多线程,不过得调用API,给个类代码: Option Explicit Option Compare Text Option Base 0Private Type udtThread Handle As Long Enabled As Boolean End TypePrivate uThread As udtThreadPrivate Const CREATE_SUSPENDED As Long = &H4 Private Const THREAD_BASE_PRIORITY_IDLE As Long = -15 Private Const THREAD_BASE_PRIORITY_LOWRT As Long = 15 Private Const THREAD_BASE_PRIORITY_MAX As Long = 2 Private Const THREAD_BASE_PRIORITY_MIN As Long = -2 Private Const THREAD_PRIORITY_HIGHEST As Long = THREAD_BASE_PRIORITY_MAX Private Const THREAD_PRIORITY_LOWEST As Long = THREAD_BASE_PRIORITY_MIN Private Const THREAD_PRIORITY_ABOVE_NORMAL As Long = (THREAD_PRIORITY_HIGHEST - 1) Private Const THREAD_PRIORITY_BELOW_NORMAL As Long = (THREAD_PRIORITY_LOWEST + 1) Private Const THREAD_PRIORITY_IDLE As Long = THREAD_BASE_PRIORITY_IDLE Private Const THREAD_PRIORITY_NORMAL As Long = 0 Private Const THREAD_PRIORITY_TIME_CRITICAL As Long = THREAD_BASE_PRIORITY_LOWRTPrivate Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long 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 Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As LongPublic Sub Initialize(ByVal lpfnBasFunc As Long) Dim lStackSize As Long, lCreationFlags As Long, lpThreadId As Long, lNull As Long
On Error Resume Next lNull = 0 lStackSize = 0 lCreationFlags = CREATE_SUSPENDED uThread.Handle = CreateThread(lNull, lStackSize, lpfnBasFunc, lNull, lCreationFlags, lpThreadId) If uThread.Handle = lNull Then MsgBox "Create thread failed!"
End Sub Public Property Get Enabled() As Boolean
On Error Resume Next Enabled = uThread.EnabledEnd Property Public Property Let Enabled(ByVal vNewValue As Boolean)
On Error Resume Next If vNewValue And (Not uThread.Enabled) Then ResumeThread uThread.Handle uThread.Enabled = True ElseIf uThread.Enabled Then SuspendThread uThread.Handle uThread.Enabled = False End IfEnd Property Public Property Get Priority() As Long On Error Resume Next Priority = GetThreadPriority(uThread.Handle)End PropertyPublic Property Let Priority(ByVal vNewValue As Long) On Error Resume Next If vNewValue = -2 Then Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_LOWEST)
ElseIf vNewValue = -1 Then Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_BELOW_NORMAL) ElseIf vNewValue = 0 Then Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_NORMAL) ElseIf vNewValue = 1 Then Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_ABOVE_NORMAL) ElseIf vNewValue = 2 Then Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_HIGHEST) End IfEnd PropertyPrivate Sub Class_Terminate() On Error Resume Next ' Pause Call TerminateThread(uThread.Handle, 0)End SubPrivate Sub Pause() While True DoEvents Wend End Sub 调用方法如下: dim mclsNewThread Is clsThread Set mclsNewThread = New clsThread With mclsNewThread .Initialize AddressOf mdlThread.StartTransfer .Enabled = True End With
更正: 调用方法如下: dim mclsNewThread As clsThread Set mclsNewThread = New clsThread With mclsNewThread .Initialize AddressOf mdlThread.StartTransfer .Enabled = True End With 其中StartTransfer为要享受该线程的方法。
你搜一下吧
Option Explicit
Option Compare Text
Option Base 0Private Type udtThread
Handle As Long
Enabled As Boolean
End TypePrivate uThread As udtThreadPrivate Const CREATE_SUSPENDED As Long = &H4
Private Const THREAD_BASE_PRIORITY_IDLE As Long = -15
Private Const THREAD_BASE_PRIORITY_LOWRT As Long = 15
Private Const THREAD_BASE_PRIORITY_MAX As Long = 2
Private Const THREAD_BASE_PRIORITY_MIN As Long = -2
Private Const THREAD_PRIORITY_HIGHEST As Long = THREAD_BASE_PRIORITY_MAX
Private Const THREAD_PRIORITY_LOWEST As Long = THREAD_BASE_PRIORITY_MIN
Private Const THREAD_PRIORITY_ABOVE_NORMAL As Long = (THREAD_PRIORITY_HIGHEST - 1)
Private Const THREAD_PRIORITY_BELOW_NORMAL As Long = (THREAD_PRIORITY_LOWEST + 1)
Private Const THREAD_PRIORITY_IDLE As Long = THREAD_BASE_PRIORITY_IDLE
Private Const THREAD_PRIORITY_NORMAL As Long = 0
Private Const THREAD_PRIORITY_TIME_CRITICAL As Long = THREAD_BASE_PRIORITY_LOWRTPrivate Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
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
Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As LongPublic Sub Initialize(ByVal lpfnBasFunc As Long) Dim lStackSize As Long, lCreationFlags As Long, lpThreadId As Long, lNull As Long
On Error Resume Next
lNull = 0
lStackSize = 0
lCreationFlags = CREATE_SUSPENDED
uThread.Handle = CreateThread(lNull, lStackSize, lpfnBasFunc, lNull, lCreationFlags, lpThreadId)
If uThread.Handle = lNull Then MsgBox "Create thread failed!"
End Sub
Public Property Get Enabled() As Boolean
On Error Resume Next
Enabled = uThread.EnabledEnd Property
Public Property Let Enabled(ByVal vNewValue As Boolean)
On Error Resume Next
If vNewValue And (Not uThread.Enabled) Then
ResumeThread uThread.Handle
uThread.Enabled = True
ElseIf uThread.Enabled Then
SuspendThread uThread.Handle
uThread.Enabled = False
End IfEnd Property
Public Property Get Priority() As Long On Error Resume Next
Priority = GetThreadPriority(uThread.Handle)End PropertyPublic Property Let Priority(ByVal vNewValue As Long) On Error Resume Next
If vNewValue = -2 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_LOWEST)
ElseIf vNewValue = -1 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_BELOW_NORMAL)
ElseIf vNewValue = 0 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_NORMAL)
ElseIf vNewValue = 1 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_ABOVE_NORMAL)
ElseIf vNewValue = 2 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_HIGHEST)
End IfEnd PropertyPrivate Sub Class_Terminate() On Error Resume Next
' Pause
Call TerminateThread(uThread.Handle, 0)End SubPrivate Sub Pause()
While True
DoEvents
Wend
End Sub
调用方法如下: dim mclsNewThread Is clsThread
Set mclsNewThread = New clsThread
With mclsNewThread
.Initialize AddressOf mdlThread.StartTransfer
.Enabled = True
End With
调用方法如下: dim mclsNewThread As clsThread
Set mclsNewThread = New clsThread
With mclsNewThread
.Initialize AddressOf mdlThread.StartTransfer
.Enabled = True
End With
其中StartTransfer为要享受该线程的方法。