|
正在做一个多线程的程序。
先做ActiveX exe工程:一个窗体(仅放个时钟)和一个类
属性设置每个对象对应一个线程。(开始用线程池,但是不能成功,就改成这个设置了)
类cTest:
Private frm As Form '用来放个时钟,启动本线程
Public frmParent As Form '因为在主程序中要设置线程数组,不能用事件,只好把主窗体引用过来,
'再执行主窗体中的过程,把运行中的数据传给住窗体
Public Index As Long '存放本进程的序号
Private WithEvents oTM As Timer '这个是启动进程的时钟
Private Sub Class_Initialize()
Set frm = New Form1
Load frm
Set oTM = frm.Timer1
oTM.Enabled = False
End Sub
Private Sub Class_Terminate()
Set oTM = Nothing
Set frmParent = Nothing
Unload frm
End Sub
...
其它不用说了,就是运行一个大循环,把中间数据实时传给住窗体。
生成aaaaa.exe文件
再做个标准exe工程:只有一个窗体,引用上边的aaaa.exe文件。
建3个标签,来实时显示3个进程回传的数据。一个创建ctest进程的按钮、一个中止所有进程的按钮。
Private MultiRun() As cTest '用来创建多个cTest类的实例
Private Const MAXRUN As Long = 3 '能创建的最大个数
Private Sub Form_Load()
ReDim MultiRun(0)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim i As Long
For i = 1 To UBound(MultiRun)
Set MultiRun(i) = Nothing
Next i
ReDim MultiRun(0)
End Sub
Private Sub Command1_Click() '创建新的进程
Dim i As Long
i = UBound(MultiRun) + 1
If i <= MAXRUN Then
ReDim Preserve MultiRun(i)
Set MultiRun(i) = New cTest
MultiRun(i).StartTest i, Me '把Me传给cTest类中的frmParent,并启动进程执行循环
Else
MsgBox "已经到达最大线程数。"
End If
End Sub
'这个是各进程中用frmParent来调用主窗体的过程,vIndex是进程的序号
Public Sub SendBack(ByVal vIndex As Long, ByVal vData As Long)
Me.Label1(vIndex - 1).Caption = vData '各进程对应的标签显示进程回传的数据
End Sub
Private Sub StopAllJob() '清楚所有进程
Dim i As Long
MsgBox "Stop: All"
For i = 1 To UBound(MultiRun)
MsgBox "Stop: " & i
'Set MultiRun(i).frmParent = Nothing
Set MultiRun(i) = Nothing
Next i
ReDim Preserve MultiRun(0)
End Sub
其它省略了
=======================================================
问题:
=======================================================
当我用
Set MultiRun(i) = Nothing
想销毁进程时,发现3个标签上的数字还在实时跳动显示,就是说进程还在运行。
我在StopAllJob中增加
Set MultiRun(i).frmParent = Nothing
也不能解决问题。
我都消除后,再继续创建线程,就发现3个标签上每个标签的数字交替跳动,
就是说有前边的3个线程仍然在回传数据。
试来试去不知道该怎么销毁cTest的实例? |
|