一:背景

在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);}

多媒体高精度定时器介绍相关推荐

  1. Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

    转自:http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...

  2. Linux 内核定时器使用 二 高精度定时器 hrtimer 的用例

    之前介绍了timer_list内核定时器,它的精度在毫秒级别,再高一点它就无能为力了,所幸内核提供了高精度定时器 hrtimer. 源文件在linux/kernel/hrtimer.c中.接口简单.下 ...

  3. PLC高精度定时器(T法测速功能块)

    S7-200 SMART PLC时间间隔指令BGN_ITIME,和CAL_ITIME采用的是系统自带的1ms高精度定时器,PLC里只能调用一次.T法测速和M法测速应用时,都需要高精度时序定时器的支持( ...

  4. python 定时器_按键精灵定时器介绍和使用,不会的小伙伴速速看看精辟

    金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot,Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚 ...

  5. (19)Zynq FPGA TTC定时器介绍

    1.1 Zynq FPGA TTC定时器介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Zynq FPGA TTC定时器介绍: 5)结束语. 1.1.2 本节引言 ...

  6. (18)Zynq FPGA 看门狗定时器介绍

    1.1 Zynq FPGA 看门狗定时器介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Zynq FPGA 看门狗定时器介绍: 5)结束语. 1.1.2 本节引言 ...

  7. (17)Zynq FPGA 全局定时器介绍

    1.1 Zynq FPGA 全局定时器介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Zynq FPGA 全局定时器介绍: 5)结束语. 1.1.2 本节引言 &q ...

  8. hpet 定时器中断 8259 linux,[OSDEV]编程高精度定时器(HPET)

    高精度定时器HPET和I/O APIC一样,用的是内存映射,映射的地址保存在BIOS提供的ACPI表格中 我们首先来获取这个地址 获取HPET的I/O内存地址 先来看一下文档的30-31页: 关键就是 ...

  9. js定时器介绍:倒计时定时器setTimeout、间隔定时器setInterval

    1.定时器介绍 在js里面,有两种定时器:倒计时定时器和间隔定时器  (1)倒计时定时器:倒计时多长时间以后执行函数 语法:setTimeout(要执行的函数,多长时间以后执行) <script ...

最新文章

  1. python输入文字如何定义文字_python如何实现手动输入文字
  2. python基础知识和运用
  3. Design Pattern - Prototype(C#)
  4. 浅析网站为什么长时间不收录?
  5. WeChat判断是否为微信浏览器访问方法:HTTP_USER_AGENT:MicroMessenger
  6. linux mysql apache php 安装_linux下安装apache与php;Apache+PHP+MySQL配置攻略
  7. undo the local changes
  8. matlab text函数
  9. 数字孪生|数字孪生装备-关键技术和发展阶段
  10. 计算机组成原理第二版第6章ppt,计算机组成原理第6章简.ppt
  11. 高中计算机基础知识课件,5.1.2 信息资源管理的方式方法
  12. 虚拟机的网络改为桥接网络
  13. java生成word文档(最简单)
  14. MAC重置NVRAM
  15. 游戏开发计划——数据元素设计(人物)
  16. 垃圾收集器的内存回收机制
  17. 学姐面经,不管怎样,先转载过来,以后慢慢享用
  18. 51单片机电路原理图_单片机晶振的必要性
  19. 李宏毅机器学习2021作业6(又名辉夜大小姐与辉夜大筒木的关系)
  20. 边玩游戏边学Python,原来编程如此有趣!

热门文章

  1. 改进多目标粒子群储能选址定容matlab 采用matlab编程得到33节点系统改进多目标储能选址定容方案
  2. CentOS 6.5下搭建Maven私服nexus
  3. 推荐一个不错的应用程序菜单框架
  4. 基于CRM理念的ERP订单管理系统
  5. Hadoop简介之望见数据湖
  6. 在线计算机扫描软件,Virscan Uploader
  7. Spring boot 实用又冷门的注解
  8. Python字符串格式化%s输出
  9. 汉语著者号自动生成系统的设计与实现
  10. Altium designer学习(一)AD画板流程总结