Python调用多媒体定时器实现高精度定时

自己在使用Python实现周期执行的任务时,通常会用time.sleep()函数实现,但该方法能实现的最小周期只有30ms左右,且定时不够精确,大概有±5ms左右的跳动。该方法可满足绝大多数应用场景,但对某些实时性要求较高的应用场景则不适用。
查阅资料得知,在Winmm.dll中提供的多媒体定时器可实现精度1ms的高精度定时,而且使用方法也颇为简单,只需要通过ctypes模块导入动态链接库并访问动态链接库中的函数即可。
以创建周期5ms,定时精度为1ms的多媒体定时器为例,部分代码如下:

from ctypes import *

# 导入动态链接库
self._winmm = windll.LoadLibrary('winmm.dll')
# 定义传入多媒体定时器的回调函数
self._cb = CFUNCTYPE(c_void_p, c_void_p, c_void_p, c_void_p, c_void_p, c_void_p)(self._timer_callback)
# 使用timeSetEvent创建定时器
self._timerId = self._winmm.timeSetEvent(5, 1, self._cb, 0, 1)

# 在此添加需要在多媒体定时器中执行的程序
def _timer_callback(self, uID, uMsg, dwUser, dw1, dw2):
	print(time.time())

程序结束时应销毁多媒体定时器,部分代码如下:

self._winmm.timeKillEvent(self._timerId)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值