VB中的多线程

 VB中实现多线程可用如下两种方法:

 

方法一:创建本身支持多线程的程序。

1、创建一个Activex EXE工程,工程名为ThreadPro,在工程属性中,线程模型(Thread model)选择Thread per object,启动方式(Start mode)选择Standalone,启动对象(Start object)选择Sub Main。

2、创建一个Form:frmWork,放一个Timer:tmrWork,工作线程将工作在这个Timer的定时器函数中。注意该窗体的Visible属性为False。

3、创建一个工作线程类,比如clsMT,其Instancing设置为MultiUse。通过CreateObject创建的clsMT对象拥有一个独立的线程。clsMT的代码如下:

 

Option Explicit Public Event WorkProcess(index As Long) Dim WithEvents workTimer As Timer Dim frmTmp As frmWork Public Sub StartThread() workTimer.Enabled = True End Sub Private Sub Class_Initialize() Set frmTmp = New frmWork Set workTimer = frmWork.tmrWork End Sub Private Sub Class_Terminate() Set frmTmp = Nothing End Sub Private Sub workTimer_Timer() workTimer.Enabled = False Call ThreadProc '线程处理函数 workTimer.Enabled = True End Sub Private Sub ThreadProc() Dim i as Long For i=0 to 9999999999 If i Mod 1000000000 = 0 Then RaiseEvent WorkProcess(i) End If Next End Sub

 

4、创建一个主界面窗口frmMain,添加一个按钮cmdStart和一个文本框Text1,该窗体的代码如下:

 

Option Explicit Dim WithEvents thread As ThreadPro.clsMT Private Sub cmbStart_Click() Set thread = CreateObject("ThreadPro.clsMT") '这里必须用CreateObject,不能用New thread.StartThread End Sub Private Sub Form_Unload(Cancel As Integer) Set thread = Nothing Quit '下一步再看这个Quit做什么 End Sub Private Sub thread_WorkProcess(index As Long) Text1.Text = CStr(index) End Sub

 

5、Activex EXE运行需要Sub Main函数。创建一个标准模块basMain,添加Sub Main函数,这里要注意一点每次CreateObject创建类实例都会调用Main函数,因此要写代码避免主窗体的重复创建,basMain模块的代码如下。现在知道上一步骤中的Quit干什么用的了吧。

 

Option Explicit Private Declare Function CreateEvent Lib "kernel32.dll" Alias "CreateEventA" ( _ ByVal lpEventAttributes As Long, _ ByVal bManualReset As Long, _ ByVal bInitialState As Long, _ ByVal lpName As String) As Long Private Declare Function OpenEvent Lib "kernel32.dll" Alias "OpenEventA" ( _ ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, _ ByVal lpName As String) As Long Private Declare Function CloseHandle Lib "kernel32.dll" ( _ ByVal hObject As Long) As Long Private Declare Sub ExitProcess Lib "kernel32.dll" ( _ ByVal uExitCode As Long) Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000 Private Const SYNCHRONIZE As Long = &H100000 Private Const EVENT_MODIFY_STATE As Long = &H2 Private Const EVENT_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &H3) Private Const MyEvent As String = "multi_thread" Dim hEvent As Long Sub Main() If GetEventHandle = 0 Then hEvent = CreateEvent(0&, False, False, MyEvent) frmMain.Show End If End Sub Private Function GetEventHandle() As Long GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent) Call CloseHandle(GetEventHandle) End Function Public Function Quit() Call CloseHandle(hEvent) End Function

 

6、代码写好,可以运行看效果了。注意在调试状态下是看不到多线程效果的,需要编译为exe后独立运行程序才行。按下cmdStart按钮后,主界面应该不会阻塞,这就是多线程了。(VC中再简单不过的事情在VB中这么费劲!!!)

 

 

方法二:创建执行线程模块。

1、创建一个Activex EXE工程,工程名为ThreadModule,和“方法一”一样在工程属性中,线程模型(Thread model)选择Thread per object,不同的是启动方式(Start mode)选择Activex Compoment,启动对象(Start object)选择None。

2、创建一个Form:frmWork,放一个Timer:tmrWork,工作线程将工作在这个Timer的定时器函数中。注意该窗体的Visible属性为False。

3、创建一个工作线程类,比如clsMT,其Instancing设置为MultiUse。clsMT的代码如下:

 

Option Explicit Public Event WorkProcess(index As Long) Dim WithEvents workTimer As Timer Dim frmTmp As frmWork Public Sub StartThread() workTimer.Enabled = True End Sub Private Sub Class_Initialize() Set frmTmp = New frmWork Set workTimer = frmWork.tmrWork End Sub Private Sub Class_Terminate() Set frmTmp = Nothing End Sub Private Sub workTimer_Timer() workTimer.Enabled = False Call ThreadProc '线程处理函数 workTimer.Enabled = True End Sub Private Sub ThreadProc() Dim i as Long For i=0 to 9999999999 If i Mod 1000000000 = 0 Then RaiseEvent WorkProcess(i) End If Next End Sub

 

4、编译工程,生成ThreadModule.exe。线程模块做好了,别的工程需要多线程时可以引用该模块,具体方法是Project->References,选择ThreadModule,如果列表中没有请单击Browse在文件夹中查找ThreadModule.exe。假设工程有窗体frmData,该窗体需要一个线程,则可以按如下代码启动线程:

 

Option Explicit Dim WithEvents thread As ThreadPro.clsMT Private Sub cmbStart_Click() Set thread = CreateObject("ThreadPro.clsMT") '这里必须用CreateObject,不能用New thread.StartThread End Sub Private Sub Form_Unload(Cancel As Integer) Set thread = Nothing End Sub Private Sub thread_WorkProcess(index As Long) ' ... 线程处理函数 End Sub

你可能感兴趣的:(VB)