问大家一个问题,用API实现的秒数毫秒会不会出现和闹钟一样的情况有丢失针?以下有API函数

zzq89120 2009-04-04 03:00:00
因为本人用过闹钟控件不是很好,就改用API,只是想知道用API会不会出现当系统繁忙时和闹钟一样卡一下快一下的!

主要想利用系统时间秒数和毫秒规则,那样觉得就不会出现秒和毫秒差了!!

闹钟如果用在精确度高的时间上不是很好用的,个人觉得!!

主要想要大家帮我看看,如果有更好的思路欢迎大家来讨论下!!代码更好

'利用API函数实现定时器功能 
'模块中:
Option Explicit
Public lTimerId As Long
Private Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
Private Sub TimerProc(ByVal lHwnd As Long, ByVal lMsg As Long, ByVal lTimerId As Long, ByVal lTime As Long)
Static i As Long
Form1.Label1.Caption = i
i = i + 1
End Sub
Public Sub StartTimer(lMinute As Long)
lTimerId = SetTimer(0, 0, lMinute, AddressOf TimerProc)
End Sub
Public Function StopTimer(lTimerId As Long) As Long
StopTimer = KillTimer(0, lTimerId)
End Function

'窗体中:
Private Sub Form_Load()
StartTimer 1000
End Sub

Private Sub Form_Unload(Cancel As Integer)
StopTimer lTimerId
End Sub
...全文
175 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzq89120 2009-04-07
  • 打赏
  • 举报
回复
谢谢大家的回答,100分都分了!!嘿
msdtx 2009-04-05
  • 打赏
  • 举报
回复
用SetTimerEvent,通过回调函数按时执行任务。虽然这样能保证显示及时,但一会影响别的任务如游戏,二回调函数本身要防重入。
VirtualDesktop 2009-04-04
  • 打赏
  • 举报
回复
SetTimer只是间隔一定时间向窗体发送一个消息通知主线程调用你定义的TimerProc而已,如果消息队列因为繁忙阻塞,会不准的
SYSSZ 2009-04-04
  • 打赏
  • 举报
回复
测试结果是还会卡,下面是我的测试代码:
Private Sub Command1_Click() '执行结果是Timer1停止,API继续运行
MsgBox "查看Label1"
End Sub

Private Sub Command2_Click() '执行结果是Timer1与API都卡了,直到文件复制完成
FileCopy "D:\新建文件夹 (2)\Movie\11.rmvb", "G:\11.rmvb" '11.rmvb是一个500M的文件
End Sub

Private Sub Form_Load()
StartTimer 10
End Sub

Private Sub Form_Unload(Cancel As Integer)
StopTimer lTimerId
End Sub

Private Sub Timer1_Timer()
Static i As Long
i = i + 1
Label2.Caption = i
End Sub
现在还是人类 2009-04-04
  • 打赏
  • 举报
回复
理论上说,PC的运算速度绝对在纳秒级别,但因为PC操作系统的工作任务比较多,
特别在执行一些可能占用系统资源比较大的程序时影响到别的程序的执行效率或速度
也是经常发生的。所以要看你具体的要求来说的。
如果你只是想实现闹钟功能,直接用系统时间判断就可以了,没必要去管什么豪秒呀什么的,
即使有点误差也是可以接受的。如果你想用PC来发送具体的波形信号给外接设备(如弹片机),
那波形的频率需要控制得很稳定才行,但高频的波形通常不会用PC来做,PC通常只是负
责和外部设备通讯,用些通用的总线协议通讯,即使时间不是那么精确也可以通讯,然后
由外部设备发送这些波形,所以我觉得在PC中没什么必要做什么很精确的定时操作,因为
这都是相对的,并不代表什么时候都能精确,问题出在PC任务内容及任务量不定,这是无
法预测的,所以程序只能做到相对的,能接受就好。
东方之珠 2009-04-04
  • 打赏
  • 举报
回复
顶顶
嗷嗷叫的老马 2009-04-04
  • 打赏
  • 举报
回复
http://www.m5home.com/blog/article.asp?id=22

用这个试下看看.

计时过程不由自己进程完成,而是通过读取系统的值完成

这样的话即使本进程被影响了,计时的精度还是不受影响...

但你的处理过程还是会被影响的,自己想想办法吧,我只是提供个思路.
of123 2009-04-04
  • 打赏
  • 举报
回复

你的用途是什么?精度要求多高?
cnzdgs 2009-04-04
  • 打赏
  • 举报
回复
Windows不是实时系统,程序运行难免会有时间差,把线程优先级设置高一些可以减少系统中运行的其它任务的干扰,另外SetTimer的误差较大,可以改成用CreateWaitableTimer等方式计时。
zlzfc 2009-04-04
  • 打赏
  • 举报
回复
Timer 函数


返回一个 Single,代表从午夜开始到现在经过的秒数。

语法

Timer

说明

Microsoft Windows中,Timer函数返回一秒的小数部分。
zzq89120 2009-04-04
  • 打赏
  • 举报
回复
请问楼上那有什么办法能让时间变得精准呢?

1,488

社区成员

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

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