有一段工作代码,需要显示其工作进度!但是工作的进度需要在另一个模式对话框中显示,该如何实现啊?

解决方案 »

  1.   

    面临的困难是当show vbModal时,代码停止了!如何使工作代码能继续执行呢
      

  2.   

    一定要模式对话框,那只能用多线程但是VB6纯API多线程程序只能以P代码编译,不能以本机代码编译
    而且在新线程中,访问主线程的对象(如控件、ADO对象等)必须手动做列集处理
    那是顶级COM高手才能玩得转的所以还是不用模式对话框现实一点
      

  3.   

    想学VB6多线程,去看Matthew Curland写的《Advanced Visual Basic》此书书评:
    http://dev.csdn.net/develop/article/13/13308.shtm
      

  4.   

    模态窗口显示的时候,会自建消息循环
    只有等到模态窗口关闭时,该消息循环才终止,这时函数才返回
    所以模态窗口显示时,以前的工作必然冻结
    其实还有另外一个办法:
    由于当模态对话框显示时会不断发送WM_ENTERIDLE消息
    挂接WH_MSGFILTER钩子
    在该钩子的回调函数中判断WM_ENTERIDLE消息,然后处理一小部分工作(不能太长,要不然会卡)但是这样需要把一个简单的循环分散了来写,对程序员的代码架构水平是很严峻的考验
    综上所述,不用模态对话框是最简单方法
      

  5.   

    同意zyl910(910:分儿,我又来了!) 的意见//要求是一定要用模式对话框啊!!!
    把其它窗体中你不想让他接收的消息拦截掉即可,这个需要进行子类处理了
    参考:
    http://discuss.fogcreek.com/joelonsoftware3/default.asp?cmd=show&ixPost=104273
      

  6.   

    我说别把简单问题复杂化!别动不动就多线程那你干脆用VC算了可以考虑这样达到你的目的:
    把Form1中变化的数据做个接口,Form2(模态窗口)显示时,以前的工作必然冻结) 中加个定时器访问那个接口就可以了!至于接口就很方便了,有多种方法。
      

  7.   

    //参考:
    //http://discuss.fogcreek.com/joelonsoftware3/default.asp?cmd=show&ixPost=104273
    DoEvents的本质就是处理线程积压消息,所以DoEvents循环就是消息循环
      

  8.   

    //把Form1中变化的数据做个接口,Form2(模态窗口)显示时,以前的工作必然冻结) 中加个定时器访问那个接口就可以了!至于接口就很方便了,有多种方法。
    还是需要将代码分散,原来只需要简单写个循环就行而且Timer的触发频率低,无法有效的利用CPU资源
      

  9.   

    不错!我也搞复杂了!DoEvents就搞定了...
    Option Explicit
    Dim i As LongPrivate Sub Command1_Click()
    Form2.Show vbModal
    DoEvents
    End SubPrivate Sub Timer1_Timer()
    i = i + 1
    Form2.Label1 = i
    End Sub
      

  10.   

    如果不用timer可以实现吗?我听那个人说,无须timer的
      

  11.   

    TO: rainstormmaster(暴风雨 v2.0)为什么要用模式对话框呢?
    其实这是个题目!而且题目明确要求是一定要用 show vbmodal 来显示模式对话框
    别人要求这么做,我也没办法啊,所以来这里问.
      

  12.   

    //DoEvents就搞定了...你那个代码不加DoEvents,时钟也在走
    只有MsgBox才会导致时钟停止
    关键是在Timer中是不适合做繁重工作
      

  13.   

    这个是我的面试时遇到的题目
    再详细一点描述一下要求在from1中设计一个循环,从1到100000递增,并且将其显示在一个本文框中
    当用户点击“start”按钮开始这个循环
    开始循环的时候必须显示一个模式对话框(form2)(必须用 show vbModal),form2上有一个进度条和一个结束按钮,进度条显示循环的进度,当用户点结束按钮的时结束循环。
      

  14.   

    感觉这个问题是在考脑筋急转弯
    这样行不:
    Form1:
    Public Sub ForValues(ByVal n As Long, ByVal v As Integer)
        Dim i As Long
        For i = 1 To n
            DoEvents
            Form1.Text1.Text = i
            If Form2.b = False Then Exit Sub
            Form2.Pb.Value = i / v
        Next i
    End SubPrivate Sub Command1_Click()
        Form2.Show vbModal
    End SubForm2:
    Public b As BooleanPrivate Sub Command1_Click()
        b = False
        Unload Me
    End SubPrivate Sub Form_Activate()
        Dim n As Long
        Dim v As Integer
        b = True
        Pb.Max = 100
        Pb.Min = 0
        Pb.Value = 0
        n = 100000
        v = 1000
        Call Form1.ForValues(n, v)
    End Sub?????
      

  15.   

    呵呵,这里的时钟是为了模拟需要的任务
    Private Sub Timer1_Timer()
    i = i + 1
    Form2.Label1 = i
    End Sub
      

  16.   

    来晚了,同意vbman2003(家人)
      

  17.   

    晕死  干吗用摸态窗体建立一个frmProcessBar 的窗体
    提供几个公开方法
    SetMax
    SetValue然后SetWindowPos 放在最上层