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

ding_zhen_si 2009-12-03 02:24:02
现有一VB6.0程序内,Timer控件间隔时间设定为1000ms
Timer空间执行的程序运行时间为10s左右
在前次代码执行期间,Timer控件的间隔时间有效吗?
比如代码执行到1s的时候,Timer控件的间隔时间到了,还会再次去执行代码吗?
哪位大侠知道
...全文
1299 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
wp5191 2009-12-25
  • 打赏
  • 举报
回复
应该不会的
yachong 2009-12-25
  • 打赏
  • 举报
回复
我觉得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
vbman2003 2009-12-25
  • 打赏
  • 举报
回复
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


threenewbee 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jhone99 的回复:]
好像是执行,试验一下就知道了
[/Quote]
恭喜。。。

lz注意 DoEvents 的引入可能会改变程序的运行顺序,并且造成全局变量或者窗体变量的混乱。
zdingyun 2009-12-24
  • 打赏
  • 举报
回复
2个Timer似乎无不干扰.
zdingyun 2009-12-24
  • 打赏
  • 举报
回复
理解错了.代码:
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代码周期.
zdingyun 2009-12-24
  • 打赏
  • 举报
回复
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
PctGL 2009-12-24
  • 打赏
  • 举报
回复
那个代码几乎没有什么代表性,加个timer,间隔 = 750,enabled =true , timer 事件中写 msgbox “timer事件”,编译后运行,最简单的代码来说明就很清楚了
zdingyun 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 pctgl 的回复:]
就10分。。。 而且通常我可能也只能得到其中的最多4分左右

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

调试和运行效果是两回事,在timer这件事上可以说运行效果更贴近实际,而vb的调试器有意禁止了一些比较特殊的东西,新手要做的不是火急火燎的知道所以,最好多看看因为,要结果是吗? 结果 = 非顺序执行,和马子的结论相反,如果这样就达到了6楼想要的,那。。。 还是多练练吧
[/Quote]
代码修改为:
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执行文件.执行结果如下:
heqingbb 2009-12-24
  • 打赏
  • 举报
回复
timer控件执行一个过程以后会返回到Form吗?
PctGL 2009-12-24
  • 打赏
  • 举报
回复
这个问题,我已经将结论给个裤衩多的分享了

马子,出来说说吧,我裤衩不够用,他们不信我的
贝隆 2009-12-23
  • 打赏
  • 举报
回复
如果不在Timer中加入DoEvents是肯定不会执行的。
cfesc9 2009-12-23
  • 打赏
  • 举报
回复
顺序执行,电脑很老实的,而且很执着,要不就不会有死循环了。
一个执行再去执行下一个。
pigpag 2009-12-06
  • 打赏
  • 举报
回复
按照原理说的话,VB的Timer用的是Windows消息循环,所以上一个Timer没有处理完,新来的WM_TIMER会堆积在消息列表中。因为VB只有一个线程,一个消息循环,所以堆积的消息要等到现在的处理完了才会被处理,而且有可能会一下子触发好多次吧。
PctGL 2009-12-06
  • 打赏
  • 举报
回复
就10分。。。 而且通常我可能也只能得到其中的最多4分左右

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

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

zdingyun 2009-12-04
  • 打赏
  • 举报
回复
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
zzhgb 2009-12-04
  • 打赏
  • 举报
回复
timer 。。。
没办法
放个变量,记录上次运行时间
下次运行的时候判断一下
luofenghen 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pctgl 的回复:]
ls用timer的方法令我十分xx..。。 既然那样用timer不如直接写个函数,何必用timer

再说我提供我认为的答案供lz参考,就不能按照我的方式提出来吗?
那个帖子里面有详细的讨论,也许lz很需要呢
[/Quote]
可能我的方法 很难理解吧
我本意是 用F8调试的 一步步执行 如果没有Timer1_Timer 这个调用 程序就无法暂停
我的意识是单步执行到a=1 看Timer1_Timer 会不会继续执行

注: 我确实是新手 请多指教~
PctGL 2009-12-04
  • 打赏
  • 举报
回复
说不会执行,也别用肯定,你肯定你对 Timer 研究够深吗?
看看我贴的帖子地址,至少你应该好好看看再下结论,至于 6楼的代码,好像对vb还只是初级了解,连常识错误都犯了,还要拿出来打我一杆子
zdingyun 2009-12-03
  • 打赏
  • 举报
回复
Private Sub Timer1_Timer()
For i = 1 To 10000000
DoEvents
Next
Debug.Print Timer
Timer1.Enabled = False
End Sub

耗时18.39秒
加载更多回复(10)

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧