我在一个程序中发现的,窗体中一个 timer 控件,间隔500ms,enabled属性为true.在vb开发环境中运行时:
如果调用了 msgbox 函数,在函数返回前,是不会发生 timer事件的,也就是说程序挂起了,等待msgbox 函数返回。编译成EXE文件,双击这个文件运行:
如果调用了 msgbox 函数,在函数返回前(也就是点击确定按钮之前),一直发生timer事件.这个问题给我带来很多麻烦,有时候在开发环境中调的好好的程序,一旦生成exe就坏菜了。随碰到过类似问题,或有解决方法,帮帮忙,谢谢了。

解决方案 »

  1.   

    代码是一个工程的一部分,不好贴
    举个例子吧
    就像这样:
    private m_X as long private sub timer1_timer()
    m_X=m_X+1
    end subprivate sub Command1_click()
    msgbox "如果是EXE,则现在m_X+1一直在增大,如果在VB开发环境中运行,则m_X+1现在是不变的,等你点了确定,它才开始增大"
    end sub
      

  2.   

    '没有问题啊?除非用的API的MessageBox,他是非模式的对话框
    Dim i As IntegerPrivate Sub Form_Load()
        i = 0
    End SubPrivate Sub Timer1_Timer()
        Me.Print i
        If i = 5 Then
            If MsgBox("是否停止?", vbYesNo + vbInformation, "提示") = vbYes Then
                Timer1.Enabled = False
                Exit Sub
            End If
        End If
        i = i + 1    
    End Sub
      

  3.   

    奇怪的问题,没有遇到过哦。而且,有现成的MsgBox不用,去用API的MessageBox干什么呢?会不会是您自己PC机的问题啊?要不打个SP6的补丁吧?
      

  4.   

    在vb开发环境中运行和运行EXE一样。。
    你可以试试,vb开发环境中运行,程序启动后,等待几秒,返回的m_X的值是不一样的。。
    说明timer事件已经发生了。。
      

  5.   

    晕,竟然真会这样,楼主很细心啊
    一直都以为msgbox会挂起程序,没想到编译后就变了
      

  6.   

    Option Explicit
    Dim X As LongPrivate Sub Command1_Click()
    Timer1.Enabled = True '启动计时器
    MsgBox "如果是从EXE运行,则下一个msgbox会显示 非 0,如果在vb开发环境中运行, 则下一个msgbox会显示 0"
    MsgBox X
    End SubPrivate Sub Form_Load()
    Timer1.Interval = 100
    Timer1.Enabled = False
    End SubPrivate Sub Timer1_Timer()
    X = X + 1
    End Sub如果用 sp5 或 sp6 的朋友没有这个问题,请告诉我。
    我这的网速太慢,我想先 确定 是否能解决问题,再去下载 补丁,
    帮帮忙,谢了!!
      

  7.   

    MsgBox "如果是从EXE运行,则下一个msgbox会显示 非 0,如果在vb开发环境中运行, 则下一个msgbox会显示 0"写到一行里,帖子上是自动换行
      

  8.   

    果然!!!
    开发时应该以exe为准吧。
      

  9.   

    当然有很多不一样,我就遇到过很多,测试和调试系统要用Exe。
      

  10.   

    有用 sp6 的朋友吗?
    我上传了代码,可以直接down下来运行看看
    http://lqweb.nease.net/timer.zip
      

  11.   

    呵呵,看来不是补丁的问题,设计所得与编译所得是不一样的啊,HOHO
      

  12.   

    本来就是这样的。api 的msgbox自然有它的好处
      

  13.   

    本来如此。如果你需要停止 Timer, 可以用 Timer.Enabled = False。然后可以用 Timer.Enabled = True 重开。
      

  14.   

    另外,当 msgbox 常数设定为 VbAbortRetryIgnore 或 VbYesNo 时,可以停止 Timer。
      

  15.   

    <--------------高手看过来! 能不能搞定这个?
    http://community.csdn.net/Expert/topic/3472/3472337.xml?temp=.2961847