vb中有个特费时的函数costtime(),这个函数和其他任何资源无关。是第三方控件的函数。执行它,程序界面就死了。是不是用多线程好些。
DoEvents是不是也行。我不会了。

解决方案 »

  1.   

    嗯,用DoEvents可以,出让控制权;也可以考虑用ActiveV EXE,实现多线程
      

  2.   

    DoEvents不行的。DoEvents在For中有用,但对于一个函数是不行的,函数不返回,再DoEvents有什么用。函数最长耗时20秒左右,才能返回,期间程序界面无响应。哪位给出个方法。ActiveX,怎么弄?
      

  3.   

    把这个函数放到一个ActiveX.exe中去执行....这样不会影响主程序
      

  4.   

    翻到一个以前回的贴子,复制一个示例:
    '--------------------------------- ActiveX.exe ----------------------------'新建一个ActiveX.exe工程名称: Test_ActiveX
    '其中类名称: cTest
    '添加一个窗体,名称: fTest
    '窗体上加一个Timer控件,名称TM
    'cTest上添加如下代码:Option ExplicitPrivate frm As Form
    Private WithEvents oTM As Timer
    Public Event TestStart()   '开始事件
    Public Event TestEnd() '结束事件Private FG As Object     '本例中用来模拟传入数据的表格控件Private Sub Class_Initialize()
        Set frm = New fTest
        Load frm
        Set oTM = frm.TM
        oTM.Enabled = False
    End SubPrivate Sub Class_Terminate()
        Set oTM = Nothing
        Unload frm
    End Sub'这个方法用来通知本程序开始执行任务
    Public Function StartTest(mData As Object) As Boolean
        '参数mData可以是你要插入的数据对象,此例中传入一个表格控件
        Set FG = mData     '实例化FG
        '延时一下
        oTM.Interval = 100
        oTM.Enabled = True
        StartTest = True
    End Function'插入数据到数据库,具体代码自己写了,这里只是随手写一下,模拟一个较长时间的操作
    Private Sub DataToDB()
        'Dim cn As connection
        Dim r As Long, c As Long
        For r = 1 To FG.Rows - 1
            For c = 1 To 300
                Debug.Print FG.Text
            Next
        Next
    End SubPrivate Sub otm_Timer()
        oTM.Enabled = False
        RaiseEvent TestStart        '触发TestStart事件
        DataToDB                    '执行"数据插入"
        RaiseEvent TestEnd          '触发TestEnd事件
    End Sub
    '--------------------------------------------------------------------------'---------------------------- 测试工程 ------------------------------------
    '运行上面的Test_ActiveX
    '新建一个测试工程
    '在工程引用菜单下引用Test_ActiveX
    '窗体上加一个command,一个Label,一个MSHFlexGrid控件
    '代码:Option ExplicitDim WithEvents Obj As cTESTPrivate Sub Form_Load()
        '加入测试数据
        Dim i As Long
        With MSHFlexGrid1
            .Cols = 2
            For i = 0 To 100
                .AddItem Chr(32) & vbTab & Format(i, "0000000000"), 1
            Next
        End With
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Set Obj = Nothing     '释放对像
    End Sub'按键代码
    Private Sub Command1_Click()    
        Set Obj = New cTEST
        Obj.StartTest MSHFlexGrid1   '传递MSHFlexGrid1中的数据,通知执行任务
    End Sub
    '类中的开始事件
    Private Sub Obj_TestStart()
        Label1.Caption = "正在执行数据更新..."
    End Sub'类中的结束事件
    Private Sub Obj_TestEnd()
        Label1.Caption = "数据更新完毕"
        Set Obj = Nothing     '释放对像
    End Sub
      

  5.   


    可以用 Timer 来显示一些东西。记住,Timer 需要在编译成 .exe 之后才能表现出类似“多线程”的功能,在 IDE 界面下看不出效果。