定时器,时间怎么控制?

PCBoy008 2008-04-09 05:15:48

用一个timer,设interval为5分钟执行一次
现在我计划每天晚上23:00执行一段程序A

注意:执行A的过程可能需要5分钟以上才能完成
------------------------------------------

那么Timer1_Timer中:

If Now > CDate(Date & " 23:00") Then
...
doA
...

问题:
如何避免A被重复执行?

例如,timer的运行时间可能是:
22:52
22:57
23:02
23:07
...
...全文
203 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2008-04-10
  • 打赏
  • 举报
回复
比如当前时间为 2008-04-10 17:19
先根据触发时间求下次触发时刻

任务 触发时间 下次触发时刻
---- ------- ----------------
A 23:00 2008-04-10 23:00
B 23:10 2008-04-10 23:10
C 23:30 2008-04-10 23:30

到了 23:00 以后执行任务 A,然后将下次触发时刻加1天

任务 触发时间 下次触发时刻
---- ------- ----------------
A 23:00 2008-04-11 23:00
B 23:10 2008-04-10 23:10
C 23:30 2008-04-10 23:30

这样最近的下一个任务就成为 B,依次类推。
PCBoy008 2008-04-10
  • 打赏
  • 举报
回复
SQL SERVER的作业,可以设定到秒,不知道他的实现方式是怎样的..
PCBoy008 2008-04-10
  • 打赏
  • 举报
回复
4F的方法正是我所考虑的

其实A只是多个任务中的一个,任务列表中还有其它的,类似:
任务 触发时间
---- -------
A 23:00
B 23:10
C 23:30
...

当interval设为1秒时,基本上不必考虑执行时长及时间段的判断
但对系统的性能可能会有影响
(若尝试interval=1分钟,不知timer会不会在59秒运行之后,因为系统资源阻塞了2秒钟而忽略了下一分钟的判断-_-| )
of123 2008-04-09
  • 打赏
  • 举报
回复
其实即使不关 Timer 也还有其他办法:
例如定义一个公共变量

Public datLastRun As Date

If (Now > CDate(Date & " 23:00")) And (datLastRun < Date) Then
datLastRun = Date
...
doA
...
cbm6666 2008-04-09
  • 打赏
  • 举报
回复
不过还好, 因为4F的 Timer 跑不了, 哈哈.....

如果加了一个d 字跑得动的话, 也大不了让楼主去跑59次的doA而已.........
cbm6666 2008-04-09
  • 打赏
  • 举报
回复
晕倒.....在他开始做其它事情时, Timer1不用关掉吗 ? 在他做完事情后, 他如果永远都不关机还要继续的话, 他不会再做个判断, 今天完事了, 楼主大不了弄个小循环或自己弄个Timer2 过了今天他再把 Timer1 打开吗?

如果以4F的代码,以分钟来判断, 而interval却是1秒, 你可别整死楼主了.
nicon 2008-04-09
  • 打赏
  • 举报
回复
请注意:楼主说的是每天都要能自动执行,如果像上面几位所说把Timer.Enable设为False,那还能每天都自动执行吗?
附上我的代码思路,欢迎指正。


'假设初始化时是
Timer1.Interval = 1000
Timer1.Enable = True

'接着
Private Sub Timer1_Timer()
'其实这里的If可以简化。
If Format$(Now,"yyyy-MM-dd HH:mm") = Format$(CDate(Date & " 23:00"),"yyyy-MM-dd HH:mm") Then
'执行A程序
doA()
EndIf
End Sub

cbm6666 2008-04-09
  • 打赏
  • 举报
回复
Dim tsec&
Private Sub Timer1_Timer()
tsec = DateDiff("s", Now, Date) + 3600 * CLng(23)
me.caption="还剩: " & cstr(tsec) & " 秒"
If tsec <= 0 Then
Timer1.Enabled = False
'call 你要做的事.....
End If
End Sub

用户 昵称 2008-04-09
  • 打赏
  • 举报
回复
楼上的高。
舉杯邀明月 2008-04-09
  • 打赏
  • 举报
回复
If Now > CDate(Date & " 23:00") Then
'加上这个:
Timer1.Enable = False
...
doA
...
end if

7,785

社区成员

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

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