wanren2008 发表于 2011-4-3 16:01:03

用ActiveX exe做多线程,怎么销毁创建的线程(类的实例)?

正在做一个多线程的程序。

先做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的实例?

马大哈 发表于 2011-4-8 08:48:42

Set MultiRun(i) = Nothing
//
在这之前你必须等待MultiRun(i)中的循环完成.比如设置一个开关,然后再等待循环检测到这个开关并退出.

不然只是除去了对象变量与对象实例间的引用关系.

wanren2008 发表于 2011-7-8 20:20:46

密码忘了。。。终于上来了
页: [1]
查看完整版本: 用ActiveX exe做多线程,怎么销毁创建的线程(类的实例)?