当前位置:编程学习 > VB >>

关于VB6.0的Timer控件执行顺序

现有一VB6.0程序内,Timer控件间隔时间设定为1000ms
Timer空间执行的程序运行时间为10s左右
在前次代码执行期间,Timer控件的间隔时间有效吗?
比如代码执行到1s的时候,Timer控件的间隔时间到了,还会再次去执行代码吗?
哪位大侠知道 --------------------编程问答-------------------- 好像是执行,试验一下就知道了 --------------------编程问答-------------------- 上一次执行未完成时不会进行下一次执行貌似.

因为始终是同一线程内,怎么样也是顺序执行. --------------------编程问答-------------------- 哈,某人升三星了,散分呗!!! --------------------编程问答-------------------- http://topic.csdn.net/u/20081225/17/b33f4b7d-c391-4d32-8ef6-db8d1d587d0d.html

lz 看这个帖子,跟你想问的问题一样 --------------------编程问答--------------------
引用 4 楼 pctgl 的回复:
http://topic.csdn.net/u/20081225/17/b33f4b7d-c391-4d32-8ef6-db8d1d587d0d.html

lz 看这个帖子,跟你想问的问题一样

看了我头晕眼花~~
其实楼主只是要个肯定的答案
比如2# 老马的就很肯定 --------------------编程问答--------------------

Option Explicit

Private Sub Form_Load()
Timer1_Timer
Dim a As Integer
a = 1
MsgBox a

End Sub

Private Sub Timer1_Timer()

MsgBox "b"

End Sub

实践证明 老马的答案是正确的 --------------------编程问答--------------------  ls用timer的方法令我十分xx..。。 既然那样用timer不如直接写个函数,何必用timer

再说我提供我认为的答案供lz参考,就不能按照我的方式提出来吗?
那个帖子里面有详细的讨论,也许lz很需要呢 --------------------编程问答--------------------
引用 4 楼 pctgl 的回复:
http://topic.csdn.net/u/20081225/17/b33f4b7d-c391-4d32-8ef6-db8d1d587d0d.html

lz 看这个帖子,跟你想问的问题一样

支持! --------------------编程问答-------------------- 肯定不会执行 --------------------编程问答-------------------- 执行与否由代码验证!
75303.59-75294.38 = 9.21
耗时间9.21秒
Option Explicit
    Dim i As Long

Private Sub Command1_Click()
    Debug.Print Timer
    Timer1.Enabled = True
End Sub

Private Sub Form_Load()
    Timer1.Interval = 100
    Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
    For i = 1 To 5000000
        DoEvents
    Next
    Debug.Print Timer
    Timer1.Enabled = False
End Sub
--------------------编程问答--------------------
Private Sub Timer1_Timer()
    For i = 1 To 10000000
        DoEvents
    Next
    Debug.Print Timer
    Timer1.Enabled = False
End Sub

耗时18.39秒 --------------------编程问答-------------------- 说不会执行,也别用肯定,你肯定你对 Timer 研究够深吗?
看看我贴的帖子地址,至少你应该好好看看再下结论,至于 6楼的代码,好像对vb还只是初级了解,连常识错误都犯了,还要拿出来打我一杆子 --------------------编程问答-------------------- 6楼使用MsgBox,将中断线程等待!
Option Explicit
    Dim i As Long

Private Sub Command1_Click()
    Debug.Print Timer
    Timer1.Enabled = True
End Sub

Private Sub Form_Load()
    Timer1.Interval = 100
    Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
    For i = 1 To 5000000
        DoEvents
    Next
    MsgBox Timer
    Debug.Print Timer
    Timer1.Enabled = False
End Sub
--------------------编程问答--------------------
引用 7 楼 pctgl 的回复:
ls用timer的方法令我十分xx..。。 既然那样用timer不如直接写个函数,何必用timer

再说我提供我认为的答案供lz参考,就不能按照我的方式提出来吗?
那个帖子里面有详细的讨论,也许lz很需要呢

可能我的方法 很难理解吧  
我本意是 用F8调试的  一步步执行  如果没有Timer1_Timer 这个调用  程序就无法暂停 
我的意识是单步执行到a=1 看Timer1_Timer 会不会继续执行

注: 我确实是新手  请多指教~ --------------------编程问答-------------------- timer 。。。
没办法
放个变量,记录上次运行时间
下次运行的时候判断一下 --------------------编程问答-------------------- 就10分。。。 而且通常我可能也只能得到其中的最多4分左右

提示 14楼一下,把你的代码原封不动的编译为exe,再运行看效果,timer的间隔设置为 500,enabled = true

调试和运行效果是两回事,在timer这件事上可以说运行效果更贴近实际,而vb的调试器有意禁止了一些比较特殊的东西,新手要做的不是火急火燎的知道所以,最好多看看因为,要结果是吗? 结果 = 非顺序执行,和马子的结论相反,如果这样就达到了6楼想要的,那。。。 还是多练练吧

--------------------编程问答-------------------- 按照原理说的话,VB的Timer用的是Windows消息循环,所以上一个Timer没有处理完,新来的WM_TIMER会堆积在消息列表中。因为VB只有一个线程,一个消息循环,所以堆积的消息要等到现在的处理完了才会被处理,而且有可能会一下子触发好多次吧。 --------------------编程问答-------------------- 顺序执行,电脑很老实的,而且很执着,要不就不会有死循环了。
一个执行再去执行下一个。 --------------------编程问答-------------------- 如果不在Timer中加入DoEvents是肯定不会执行的。 --------------------编程问答-------------------- 这个问题,我已经将结论给个裤衩多的分享了

 马子,出来说说吧,我裤衩不够用,他们不信我的 --------------------编程问答-------------------- timer控件执行一个过程以后会返回到Form吗? --------------------编程问答--------------------
引用 16 楼 pctgl 的回复:
就10分。。。 而且通常我可能也只能得到其中的最多4分左右

提示 14楼一下,把你的代码原封不动的编译为exe,再运行看效果,timer的间隔设置为 500,enabled = true

调试和运行效果是两回事,在timer这件事上可以说运行效果更贴近实际,而vb的调试器有意禁止了一些比较特殊的东西,新手要做的不是火急火燎的知道所以,最好多看看因为,要结果是吗? 结果 = 非顺序执行,和马子的结论相反,如果这样就达到了6楼想要的,那。。。 还是多练练吧

代码修改为:
Option Explicit
    Dim i As Long

Private Sub Command1_Click()
    Print Timer
    Timer1.Enabled = True
End Sub

Private Sub Form_Load()
    Timer1.Interval = 100
    Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
    For i = 1 To 5000000
        DoEvents
    Next
    'MsgBox Timer
    Print Timer
    Timer1.Enabled = False
End Sub

按PcTgl提示编译为EXE执行文件.执行结果如下:
--------------------编程问答-------------------- 那个代码几乎没有什么代表性,加个timer,间隔 = 750,enabled =true , timer 事件中写 msgbox “timer事件”,编译后运行,最简单的代码来说明就很清楚了  --------------------编程问答--------------------
Option Explicit
    Dim i As Long

Private Sub Command1_Click()
    Print Timer
    Timer1.Enabled = True
End Sub

Private Sub Form_Load()
    Timer1.Interval = 750
    Timer1.Enabled = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
    End
End Sub

Private Sub Timer1_Timer()
    For i = 1 To 5000000
        DoEvents
    Next
    MsgBox Timer
    'Print Timer
    'Timer1.Enabled = False
End Sub

运行结果:

试了3个周期,耗时33.03S --------------------编程问答-------------------- 理解错了.代码:
Option Explicit
    Dim i As Long

Private Sub Command1_Click()
    Print Timer
    Timer1.Enabled = True
End Sub

Private Sub Form_Load()
    Timer1.Interval = 100
    Timer1.Enabled = False
    Timer2.Interval = 750
    Timer2.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
    End
End Sub

Private Sub Timer1_Timer()
    For i = 1 To 5000000
        DoEvents
    Next
    'MsgBox Timer
    Print Timer
    'Timer1.Enabled = False
End Sub

Private Sub Timer2_Timer()
Print "timer事件"
End Sub

我不太愿意使用msgbox,直接在窗体打印,效果:

2个TIMER的计时周期不一:TIMER1约10S,TIMER2约25次/2个TIMER1代码周期. --------------------编程问答-------------------- 2个Timer似乎无不干扰. --------------------编程问答--------------------
引用 1 楼 jhone99 的回复:
好像是执行,试验一下就知道了

恭喜。。。

lz注意 DoEvents 的引入可能会改变程序的运行顺序,并且造成全局变量或者窗体变量的混乱。 --------------------编程问答-------------------- MSDN:
当 Timer 事件获得控制后使运行的时间稍长于为 Interval 属性指定的时间。这将确保后台任务能够利用系统分配的每一时刻的处理器时间。直到这个事件结束处理之前,下一个 Timer 事件都在消息队列中等待。
上述内容好象是作为一个技术原则来描述的...
不过我对timer没研究,主观上一直也是这样认为的,刚才用1个timer加了10个label控件长时间填充caption,测试结果是顺序执行,编译后也一样。不知道方法对不对,代码:

Option Explicit
'一个timer,一个command,控件(数组)label1(0)一个,一个label2

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Function TimerTest(lab1 As Label, lab2 As Label) As Double
    '返回执行时间
    Const NUM = 30000
    Dim i As Long
    Dim t As Double
        
    t = GetTickCount
    For i = 1 To NUM
        If i = 1 Or i = NUM Then
            lab1.Caption = i
        Else
            lab2.Caption = i
        End If
        DoEvents
    Next
    TimerTest = GetTickCount - t
    
End Function

Private Sub Form_Load()
    
    Dim i As Long
    
    Timer1.Enabled = False
    Timer1.Interval = 1000
    
    For i = 1 To 9
        Load Label1(i)
        With Label1(i)
            .Top = Label1(i - 1).Top + 300
            .Visible = True
        End With
    Next
        
End Sub

Private Sub Command1_Click()
    Timer1.Enabled = Not Timer1.Enabled
End Sub

Private Sub Timer1_Timer()
    Static n As Long
    Print TimerTest(Label1(n), Label2)
    n = n + 1
    If n = 10 Then
        Timer1.Enabled = False
        n = 0
    End If
End Sub


--------------------编程问答-------------------- 我觉得6楼的代码挺好的,删掉Form_Load事件的代码完全可以说明Timer时间是顺序执行的。
按照6楼的想法改写的
Private Sub Form_Load()
    Me.AutoRedraw = True
    Timer1.Interval = 1000
End Sub

Private Sub Timer1_Timer()
    Dim t As Date
    Print Now
    t = Now
    Do While DateDiff("s", t, Now) < 10 '耗费10秒时间
    Loop
End Sub
--------------------编程问答-------------------- 应该不会的
补充:VB ,  控件
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,