我是放在标准模块中的啊,只是调用的时候我加了几个参数,特别是其中包括MSHGRID控件

解决方案 »

  1.   

    就是你呀?我那天说的可能不够明确:终止线程其实可以不用那个CR变量判断,可直接用Run3Thread.Terminate,只要新线程中运行的函数没有调用它函数自身外的东西就不会有内存泄漏的危险。但是,用Terminate必须编译成exe后才可以完全退出,在VB环境中即使没有内存泄漏也不能中止,我也不知道为什么?
    所以,保险起见,还是用一个变量来判断让函数自行结束比较好!明白吗?
      

  2.   

    还是没看懂,编译成EXE是什么意思,难道这个函数只有在整个程序编译成可执行文件后才有效,在调试状态下没有作用吗.
    对于我这种情况会不会有你说的内存泄漏的问题.
      

  3.   

    你用多线程运行的函数是什么,贴出来我看看。编译成EXE是指在VB环境中不管怎样,Terminate后都不能中止,所以我贴给你的例子用了CR变量来判断。但编译成EXE后同样的代码,只要没有内存泄漏,Terminate后再关闭整个程序就可以完全退出进程。
      

  4.   

    简单来说就是多线程不能在VB中调试,所以用VB编多线程很困难。
      

  5.   

    我又仔细看了一下,发现以下问题:你这样启动函数是完全不对的:
        Call AddSurveyResultToGrid(udfCurrentNode, MSHGridData, datQueryDate)
        udfRunThread.Initialize AddressOf AddSurveyResultToGrid
    我给你例子中多线程运行函数的方法是:
    Run3Thread.Initialize AddressOf RunRunRun
    Run3Thread.Enabled = True
    这样就已经运行了
    你上面那个Call等于在主线程运行函数,所以正确方法是:
    udfRunThread.Initialize AddressOf AddSurveyResultToGrid
    udfRunThread.Enabled = True用多线程运行的函数无法传递参数!
    所以你要用全局变量等其他方法传递参数。还有,根据你说的函数中需要用到MSHGRID控件等来看,你绝对不能用udfRunThread.Terminate来终止函数,还是用全局变量来判断吧!多线程也是API,所以不存在VB用不了的事情,即使用VC编也有以上我说的限制,只要你正确使用就OK!
      

  6.   

    '类似问题
    我在线程函数中设置了一个变量,先设置为True ,然后等待执行结束后再中断.
    Private Sub Form_Unload(Cancel As Integer)
      bStop = True
      If Not objThreadDown Is Nothing Then
        bStopThread = True
        Sleep (300)
        objThreadDown.TerminateCurrentThread
        Set objThreadDown = Nothing
      End If
    End Sub