多媒体高精度定时器介绍
一:背景
在Windows系统下播放多媒体时,需要去精确控制播放过程,如果用Windows产生的WM_TIMER常规定时器来实现,多媒体画面会出现断断续续的现象,原因在于WM_TIMER只能提供大于等于55ms的精确定时。解决办法就是利用Windows系统本身提供的一个可以精确到1ms的多媒体定时器,它完全可以保证多媒体播放的实时性要求。
在Windows系统下播放多媒体时,需要去精确控制播放过程,如果用Windows产生的WM_TIMER常规定时器来实现,多媒体画面会出现断断续续的现象,原因在于WM_TIMER只能提供大于等于55ms的精确定时。解决办法就是利用Windows系统本身提供的一个可以精确到1ms的多媒体定时器,它完全可以保证多媒体播放的实时性要求
二:使用函数与变量
1:LARGE_INTEGER
类型是union,用于表示64位有符号整数值.其他定义如下:
typeef union _ LARGE_INTEGER
{
struct
{
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;
特 点:如果你有编译器直接支持64位整数可以直接使用QuadPart(64位),否则分别对LowPart(32位)和HighPart(32位)存取,
HighPart的最高位为符号位。
表示范围:--3689348814741910324到+4611686018427387903
内存布局:LARGE_INTEGER的值等4000000000,在内存中的布局:
00 28 6B EE 00 00 00 00
(低字节 ) (高字节 )
2:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
类 型:Win32API
作 用:返回硬件支持的高精度计数器的频率。
返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。
描 述:技术特点供WIN9X使用的高精度定时器,要求计算机从硬件上支持高精度定时器。
2:BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
类 型:Win32API
作 用:返回硬件支持的高精度计数器的频率技术值。
返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。
描 述:
三:实现过程
在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率;
接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter();
最后利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。
四:示例1 测试函数SLEEP(100)的精确持续时间方法:
LARGE_INTEGER freq; //CUP频率LARGE_INTEGER count1; //第一次CPU计数值LARGE_INTEGER count2; //第二次CPU计数值double ld_freq = 0.0;double ld_count1 = 0.0;double ld_count2 = 0.0;//获得时钟频率QueryPerformanceFrequency(&freq);ld_freq=(double)freq.QuadPart;//获得第一次CPU计数值QueryPerformanceCounter(&count1);ld_count1=count1.QuadPart;Sleep(100);//获得第二次CPU计数值QueryPerformanceCounter(&count2);ld_count2=count2.QuadPart;dfm=(double)(ld_count2-ld_count1);dft=dfm/dff;//获得对应的时间值
备注:需要注意的是DFT计算的结果单位是秒。
示例2 毫秒级延迟
void Delay_MS(double delay_ms){LARGE_INTEGER CPU_freq ;//CUP频率LARGE_INTEGER CPU_count_base;//开始计数值LARGE_INTEGER CPU_count_curr;//当前技术值double passed_time ;//从0开始,过来多长时间//获得时钟频率QueryPerformanceFrequency(&CPU_freq);//获取开始寄存器计数值QueryPerformanceCounter(&CPU_count_base);//计时等待do{QueryPerformanceCounter(&CPU_count_curr);passed_time = ((CPU_count_curr.QuadPart - CPU_count_base.QuadPart) * 1000) / CPU_freq.QuadPart;}while (passed_time < delay_ms);}
多媒体高精度定时器介绍相关推荐
- Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现
转自:http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...
- Linux 内核定时器使用 二 高精度定时器 hrtimer 的用例
之前介绍了timer_list内核定时器,它的精度在毫秒级别,再高一点它就无能为力了,所幸内核提供了高精度定时器 hrtimer. 源文件在linux/kernel/hrtimer.c中.接口简单.下 ...
- PLC高精度定时器(T法测速功能块)
S7-200 SMART PLC时间间隔指令BGN_ITIME,和CAL_ITIME采用的是系统自带的1ms高精度定时器,PLC里只能调用一次.T法测速和M法测速应用时,都需要高精度时序定时器的支持( ...
- python 定时器_按键精灵定时器介绍和使用,不会的小伙伴速速看看精辟
金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot,Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚 ...
- (19)Zynq FPGA TTC定时器介绍
1.1 Zynq FPGA TTC定时器介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Zynq FPGA TTC定时器介绍: 5)结束语. 1.1.2 本节引言 ...
- (18)Zynq FPGA 看门狗定时器介绍
1.1 Zynq FPGA 看门狗定时器介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Zynq FPGA 看门狗定时器介绍: 5)结束语. 1.1.2 本节引言 ...
- (17)Zynq FPGA 全局定时器介绍
1.1 Zynq FPGA 全局定时器介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Zynq FPGA 全局定时器介绍: 5)结束语. 1.1.2 本节引言 &q ...
- hpet 定时器中断 8259 linux,[OSDEV]编程高精度定时器(HPET)
高精度定时器HPET和I/O APIC一样,用的是内存映射,映射的地址保存在BIOS提供的ACPI表格中 我们首先来获取这个地址 获取HPET的I/O内存地址 先来看一下文档的30-31页: 关键就是 ...
- js定时器介绍:倒计时定时器setTimeout、间隔定时器setInterval
1.定时器介绍 在js里面,有两种定时器:倒计时定时器和间隔定时器 (1)倒计时定时器:倒计时多长时间以后执行函数 语法:setTimeout(要执行的函数,多长时间以后执行) <script ...
最新文章
- python输入文字如何定义文字_python如何实现手动输入文字
- python基础知识和运用
- Design Pattern - Prototype(C#)
- 浅析网站为什么长时间不收录?
- WeChat判断是否为微信浏览器访问方法:HTTP_USER_AGENT:MicroMessenger
- linux mysql apache php 安装_linux下安装apache与php;Apache+PHP+MySQL配置攻略
- undo the local changes
- matlab text函数
- 数字孪生|数字孪生装备-关键技术和发展阶段
- 计算机组成原理第二版第6章ppt,计算机组成原理第6章简.ppt
- 高中计算机基础知识课件,5.1.2 信息资源管理的方式方法
- 虚拟机的网络改为桥接网络
- java生成word文档(最简单)
- MAC重置NVRAM
- 游戏开发计划——数据元素设计(人物)
- 垃圾收集器的内存回收机制
- 学姐面经,不管怎样,先转载过来,以后慢慢享用
- 51单片机电路原理图_单片机晶振的必要性
- 李宏毅机器学习2021作业6(又名辉夜大小姐与辉夜大筒木的关系)
- 边玩游戏边学Python,原来编程如此有趣!