关于VB6.0的Timer控件执行顺序
现有一VB6.0程序内,Timer控件间隔时间设定为1000msTimer空间执行的程序运行时间为10s左右
在前次代码执行期间,Timer控件的间隔时间有效吗?
比如代码执行到1s的时候,Timer控件的间隔时间到了,还会再次去执行代码吗?
哪位大侠知道 --------------------编程问答-------------------- 好像是执行,试验一下就知道了 --------------------编程问答-------------------- 上一次执行未完成时不会进行下一次执行貌似.
因为始终是同一线程内,怎么样也是顺序执行. --------------------编程问答-------------------- 哈,某人升三星了,散分呗!!! --------------------编程问答-------------------- 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很需要呢 --------------------编程问答--------------------
支持! --------------------编程问答-------------------- 肯定不会执行 --------------------编程问答-------------------- 执行与否由代码验证!
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
可能我的方法 很难理解吧
我本意是 用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吗? --------------------编程问答--------------------
代码修改为:
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似乎无不干扰. --------------------编程问答--------------------
恭喜。。。
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 , 控件