ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 208|回复: 1

[分享] VBA高精度延时函数,精度1毫秒,VB6不占用CPU不卡顿

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-26 21:27 | 显示全部楼层 |阅读模式
本帖最后由 逍遥爱迪生 于 2024-5-26 21:31 编辑

VBA高精度延时函数,精度1毫秒,VB6不占用CPU不卡顿


电脑默认计时精度是15毫秒左右,使用之前执行一次timeBeginPeriod 1,让计时器精度达到1毫秒

然后就可以多次使用延时:
Puase 1000
Puase 3500


Declare Function timeBeginPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long '提高计时器精度

Declare Function CreateWaitableTimerW Lib "kernel32.dll" (Optional ByVal lpTimerAttributes As Long, Optional ByVal bManualReset As Long, Optional ByVal lpTimerName As Long) As Long
Declare Function SetWaitableTimer Lib "kernel32.dll" (ByVal hTimer As Long, ByRef pDueTime As Currency, Optional ByVal lPeriod As Long, Optional ByVal pfnCompletionRoutine As Long, Optional ByVal lpArgToCompletionRoutine As Long, Optional ByVal fResume As Long) As Long
Declare Function MsgWaitForMultipleObjects Lib "user32.dll" (ByVal nCount As Long, ByRef pHandles As Long, ByVal bWaitAll As Long, ByVal dwMilliseconds As Long, ByVal dwWakeMask As Long) As Long
Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Public Const INFINITE As Long = -1&, QS_ALLINPUT As Long = &H4FF&


Sub Puase(ByVal MilliSeconds As Currency) '延时N毫秒
'版权所有,请保留作者信息
'逍遥爱迪生 QQ:527524938
'你可以免费使用,转发
Dim hTimer As Long
hTimer = CreateWaitableTimerW
Call SetWaitableTimer(hTimer, -MilliSeconds)
Do While MsgWaitForMultipleObjects(1&, hTimer, 0&, INFINITE, QS_ALLINPUT)
DoEvents
Loop
CloseHandle hTimer
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-26 21:33 | 显示全部楼层
延时2秒,采用SetWaitableTimer,设定延时1998毫秒,剩下多少毫秒通过计算出来是1.023毫秒,再用死循环给他执行,相当于sleep 1.023毫秒。
就可以得到一个100%准确的延时函数。误差可能只有一微秒。
不占用cpu无卡顿的延时

为了提高计时器精度所以用了不少API。实际上这种只有在精准控制游戏帧率,工厂机器上位机准确发送指令所用,也用不了这么高精度。

计时器间隔为1秒,每次计时器触发,修改延时毫秒数,修正误差(比如延时995毫秒,延时1002毫秒),最终100次,1000次的计时器触发,(不限次数运行)累计误差也只有0.5毫秒左右(由最后一次延时产生)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-17 21:53 , Processed in 0.039403 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表