【Timer控件】问题

skylinecn 2010-03-22 11:30:23
请教老师们,我的程序有N个过程用到延时,sleep(多线程中抢占优先权)之类的我暂时不考虑,我偏向使用Timer控件,如何才能在过程中启动Timer延时后又回到原来延时的语句后边,我的过程比较多用的延时,请老师们指点一个科学的方法,谢谢!


给个例子:
public sub a ()
语句……
Timer延时
语句……
语句……
Timer延时
语句……
end sub

public sub b ()
语句……
Timer延时
语句……
语句……
Timer延时
语句……
end sub
...全文
301 28 打赏 收藏 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
skylinecn 2010-08-11
  • 打赏
  • 举报
回复
晕,几个月没来了,居然有帖子未结。
zfl2k 2010-04-06
  • 打赏
  • 举报
回复
同一个sub可以用你的代码的
public sub a()
语句……
Form1.Timer1.Interval = 1000: Form1.Timer1.Enabled = True
While Form1.Timer1
DoEvents
Wend
语句……
Form1.Timer2.Interval = 2000: Form1.Timer2.Enabled = True
While Form1.Timer2
DoEvents
Wend
语句……
end sub
moke520 2010-04-06
  • 打赏
  • 举报
回复
娃娃这贴还没结 - -
chinaboyzyq 2010-03-23
  • 打赏
  • 举报
回复
up~
apm90degao1 2010-03-23
  • 打赏
  • 举报
回复
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Function Delay(Num As Long) As Long
Dim t As Long
t = timeGetTime
Do
DoEvents
Loop Until timeGetTime - t >= Num
End Function
苍狼传说 2010-03-23
  • 打赏
  • 举报
回复
你试试10楼的类,基本上可以达到你的要求,别的地方该用timer的地方还用timer,都正常使用。
Tiger_Zhao 2010-03-23
  • 打赏
  • 举报
回复
Command1 用来控件数组以简化代码
Option Explicit

Private Type TypeTask
ID As Long
IsWating As Boolean
OnTimer As Single
End Type

Private Const TASK_COUNT As Long = 2
Private m_Tasks(TASK_COUNT - 1) As TypeTask

Private Function TimerToString(ByVal f As Single) As String
Dim lSeconds As Long
Dim dt As Date

lSeconds = Fix(f)
dt = TimeSerial(0, lSeconds \ 60, lSeconds Mod 60)

TimerToString = Format$(dt, "hh:mm:ss") & _
Format$(f - lSeconds, ".00")
End Function

Private Sub Command1_Click(Index As Integer)
Dim fNow As Single

fNow = Timer()

With m_Tasks(Index)
Debug.Print TimerToString(fNow), "Start Timer " & .ID

.OnTimer = fNow + (Index + 1)
.IsWating = True
End With
End Sub

Private Sub Form_Load()
Dim i As Long

For i = 0 To TASK_COUNT - 1
m_Tasks(i).ID = i + 1
Next

Timer1.Interval = 50
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Dim fNow As Single
Dim i As Long

fNow = Timer()

For i = 0 To TASK_COUNT - 1
With m_Tasks(i)
If .IsWating Then
If fNow >= .OnTimer Then
Debug.Print TimerToString(fNow), "Finish Timer " & .ID

.IsWating = False
End If
End If
End With
Next
End Sub
Tiger_Zhao 2010-03-23
  • 打赏
  • 举报
回复
将你每个“定时”结束后需要执行的功能做成一个个任务。
用一个定时器进行定时轮询,到点执行相应的任务。
skylinecn 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 moke520 的回复:]
帮 skylinecn 顶。。。。。。。。。
总帮我的说
[/Quote]
谢谢,互相学习。
moke520 2010-03-23
  • 打赏
  • 举报
回复
帮 skylinecn 顶。。。。。。。。。
总帮我的说
skylinecn 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 zhao4zhong1 的回复:]
将原来的流程切割成由很多小片断组成的状态机。
[/Quote]
有点意思,我之前有总这想法,但基础有限,是否有科学的结构方法,如果可以请老师提供一下代码例子。谢谢!



------------
楼上众位老师的提议,我下午琢磨一下,最近有点忙,谢谢了。
赵4老师 2010-03-23
  • 打赏
  • 举报
回复
将原来的流程切割成由很多小片断组成的状态机。
skylinecn 2010-03-22
  • 打赏
  • 举报
回复
感谢楼上众位老师指点!

再请教一下基础问题,感觉程序写多了思维越含糊,比如一个过程中带有“另一个延时过程”会不会出现他延时过程没有结束马上跳下一句?
vb中会不会存在过程没执行完就直接条下一句,例如:
public sub a()
a1'有什么情况会出现没有执行完直接执行下一句
a2
end sub

public sub a1()
延时……
end sub

public sub a2()
读取……
end sub



---------------------------
vb中有没有限制几层过程套用

例:
public sub a()
a1
end sub

public sub a1()
a2
end sub

public sub a2
……
end sub
贝隆 2010-03-22
  • 打赏
  • 举报
回复
楼主看看这个,功能类似Sleep,但不独占CPU,不会阻塞别的任务
'lngD要延迟的时间,单位:ms
'Gettickcount:API函数,需要你自己添加声明
public sub subSleep(byval lngD as long)
dim lngP as long
lngP=Gettickcount
do
Doevents
loop until getTickcount-lngP>lngD
end sub
skylinecn 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 king06 的回复:]
抢占优先权没什么关系吧,即便是用timer控件,也是执行完一个过程再执行下面的。
都是紧凑的步骤,省不下多少资源啊
[/Quote]
谢谢老师指点,也许我没表达清晰,请您见谅,我的程序是同时几个线程运行的,我之前用过你的方法,在单线执行中不错,可是多线中,只要一个线程出现do之后其他线程都停下来了,感觉不是很好,还是非常感谢您的指点。
bcrun 2010-03-22
  • 打赏
  • 举报
回复
用Doevents时实际上就意味着要处理并行问题了,不过这也是没有办法的事了
king06 2010-03-22
  • 打赏
  • 举报
回复
抢占优先权没什么关系吧,即便是用timer控件,也是执行完一个过程再执行下面的。
都是紧凑的步骤,省不下多少资源啊
Tiger_Zhao 2010-03-22
  • 打赏
  • 举报
回复
Option Explicit

Private Sub Wait(ByVal MilliSeconds As Long)
Timer1.Interval = MilliSeconds
Timer1.Enabled = True

While Timer1.Enabled
DoEvents
Wend
End Sub

Public Sub a()
Debug.Print Now, "Start Timer 1"
Wait 2000
Debug.Print Now, "Finish Timer 1"

Debug.Print Now, "Start Timer 2"
Wait 4000
Debug.Print Now, "Finish Timer 2"
End Sub

Private Sub Command1_Click()
a
End Sub

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

Private Sub Timer1_Timer()
Timer1.Enabled = False
End Sub
skylinecn 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 king06 的回复:]
延时一秒

VB code
dim t as single
t=timer
do
doevents
loop while timer-t <1
[/Quote]
谢谢老师,do(多线程中抢占优先权)
king06 2010-03-22
  • 打赏
  • 举报
回复
延时一秒
dim t as single 
t=timer
do
doevents
loop while timer-t <1
加载更多回复(8)

1,453

社区成员

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

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