注册 登录
编程论坛 VFP论坛

请教延时问题?

wxzd123 发布于 2023-04-13 11:32, 362 次点击
使用Declare Sleep IN kernel32 INTEGER dwMilliseconds
或木瓜老师Set Library To myFll
Sleep(1) 大约16ms左右
使用inkey()大约70ms左右
请问还有其他方法吗?
吹水佬版主提过要更高精度的可试试API的QueryPerformanceCounter()或QueryPerformanceFrequency()这两个怎么用?
谢谢
18 回复
#2
倦猫19732023-04-13 13:13
有意思,我很想知道你得怎么测的,你有毫秒表不成?

只有本站会员才能查看附件,请 登录

#3
倦猫19732023-04-13 13:17
百度了一下书上说:操作系统级的最高精度只能是3毫秒,且不管是什么系统。如果需要突破这一层限制,得用 MASM。
#4
吹水佬2023-04-13 15:24
以下是引用wxzd123在2023-4-13 11:32:44的发言:

使用Declare Sleep IN kernel32 INTEGER dwMilliseconds
或木瓜老师Set Library To myFll
Sleep(1) 大约16ms左右
使用inkey()大约70ms左右
请问还有其他方法吗?
吹水佬版主提过要更高精度的可试试API的QueryPerformanceCounter()或QueryPerformanceFrequency()这两个怎么用?
谢谢

VFP解释语言层面就谈不上高精度延时,定时器也说的是毫秒级,纯VFP命令测试可能有几十毫秒以上。
程序代码:
DECLARE long QueryPerformanceFrequency IN kernel32 string@
DECLARE long QueryPerformanceCounter   IN kernel32 string@
large = REPLICATE(0h00,8)
QueryPerformanceFrequency(@large)
nFreq = CTOBIN(LEFT(large,4),"4rs")
QueryPerformanceCounter(@large)
nBegin = CTOBIN(LEFT(large,4),"4rs")
QueryPerformanceCounter(@large)
nEnd = CTOBIN(LEFT(large,4),"4rs")
DO WHILE ((nEnd - nBegin) / nFreq) < 0.001
    QueryPerformanceCounter(@large)
    nEnd = CTOBIN(LEFT(large,4),"4rs")
ENDDO
? (nEnd - nBegin) / nFreq




[此贴子已经被作者于2023-4-13 15:50编辑过]

#5
吹水佬2023-04-13 15:42
QueryPerformanceCounter是1us级,用的是64位计数,VFP要扩展才可以做得高精度。
用 C 测试:
只有本站会员才能查看附件,请 登录

#6
吹水佬2023-04-13 15:55
SECONDS() 1ms级
t = SECONDS()
DO WHILE (SECONDS()-t) < 0.001
ENDDO
? SECONDS()-t
#7
wxzd1232023-04-13 19:54
谢谢版主,每次执行还有变化
只有本站会员才能查看附件,请 登录
#8
iswith2023-04-13 21:24
[quote]以下是引用倦猫1973在2023-4-13 13:17:06的发言:
我比较赞同这个思路,在windows系统上你不管如何努力,精度不会太高。。。。
#9
吹水佬2023-04-13 21:55
以下是引用wxzd123在2023-4-13 19:54:10的发言:

谢谢版主,每次执行还有变化

解释语言是这样的了,要求不能太高。
简单写个us级的dll给VFP试试能否满足要求
只有本站会员才能查看附件,请 登录

测试代码
程序代码:
CLEAR
DECLARE double delay IN delay.dll double
? delay(0.000001)
? delay(0.001)
? delay(0.1)
? delay(0.5)
? delay(1)
#10
wxzd1232023-04-13 22:08
版主这个厉害
#11
吹水佬2023-04-13 22:29
以下是引用wxzd123在2023-4-13 22:08:53的发言:

 版主这个厉害

us级的应该能满足VFP的“高精度”要求。
理论上取时钟频率计数,时钟频率是固定的,误差一般不超过0.5us,精度与CPU等硬件配置有关。
实际应用就要看系统资源使用情况了,CPU跑到“挂了”就算计算精度多高也没什么好结果。
#12
schtg2023-04-14 06:09
回复 9楼 吹水佬
好!
#13
倦猫19732023-04-14 07:33
我的意思是说:Win 下开发出来的计时器本身就存在3毫秒的误差,主板自身又有3毫秒已经误差,再侦测这个时间,又有3毫秒误差。。。。。
#14
吹水佬2023-04-14 08:32
以下是引用倦猫1973在2023-4-14 07:33:10的发言:

我的意思是说:Win 下开发出来的计时器本身就存在3毫秒的误差,主板自身又有3毫秒已经误差,再侦测这个时间,又有3毫秒误差。。。。。

这与“延时”有什么关系?
楼主问题的“延时”,个人理解是程序中处理一个延时事务过程前后的时差,这个时差的“精度”也只是相对程序延时事务过程的需求。
#15
吹水佬2023-04-14 08:42
以下是引用倦猫1973在2023-4-14 07:33:10的发言:

我的意思是说:Win 下开发出来的计时器本身就存在3毫秒的误差,主板自身又有3毫秒已经误差,再侦测这个时间,又有3毫秒误差。。。。。

这个“存在3毫秒的误差”对9楼代码的测试又怎样解释呢?
#16
吹水佬2023-04-14 09:30
以下是引用iswith在2023-4-13 21:24:18的发言:

我比较赞同这个思路,在windows系统上你不管如何努力,精度不会太高。。。。

应该不是windows的问题,只是VFP解释语言的问题。
windows的API能做到us级误差0.5us,除非“精度不会太高”真的有要求那么高。这已超出windows开放的范围,要去最底层BIOS里面搞了。
#17
wxzd1232023-04-15 20:14
请教版主这个使用注意什么?把代码放在主程序,在各表单就只写delay(0.5),可以吧?
为什么出现这个错误?
只有本站会员才能查看附件,请 登录
,谢谢老师

#18
吹水佬2023-04-15 20:30
回复 17楼 wxzd123
delay 小写
#19
wxzd1232023-04-15 21:12
谢谢版主,我说的两个程序主程序一个好用一个不好用,比较没看出问题,原来大小写不同,还是不够仔细呀,还得辛苦版主
1