找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7873|回复: 2

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

[复制链接]

7

主题

38

回帖

0

精华

铜牌会员

积分
247
发表于 2011-4-3 16:01:03 | 显示全部楼层 |阅读模式
正在做一个多线程的程序。

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

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-4-8 08:48:42 | 显示全部楼层
Set MultiRun(i) = Nothing
//
在这之前你必须等待MultiRun(i)中的循环完成.比如设置一个开关,然后再等待循环检测到这个开关并退出.

不然只是除去了对象变量与对象实例间的引用关系.
我就是嗷嗷叫的老马了......

7

主题

38

回帖

0

精华

铜牌会员

积分
247
 楼主| 发表于 2011-7-8 20:20:46 | 显示全部楼层
密码忘了。。。终于上来了
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表