KeSetTimer定时精度是因为windows系统的时钟分辨率仅为15ms,由于播出软件只是一个应用程序,十分依赖它的运行环境—操作系统。因此不得不提及Windows操作系统的时间片和时钟分辨率。
软件经常使用的API函数GetTickCount () 返回自系统启动以来的ms数,由于系统分辨率的限制,那么返回的只能是15.625ms的整数倍,这就是操作系统的时钟分辨率的概念。操作系统的时钟分辨率直接对操作系统提供的线程相关API有影响,例如在播控软件代码里调用的函数event.Lock(TIMECLIP);其实质是调用了系统API函数WaitForSingleObject();虽然TIMECLIP是6即希望锁定线程6ms但是由于XP的时钟分辨率是15.625ms,所以上述语句实际是锁定线程15.625ms,通过在这条语句前后加测量可证实这一点。
通过使用微软的一个测试工具ClockRes(用来测试操作系统的时钟分辨率的工具)在多核机器上分别测试了WindowXP,Window2003Server,和Windows7,测试结果如下表:
测试结果如下表
从上表中可以看出WindowXP和Windows7实际上是可以支持1ms的时钟分辨率,但这必须要开发设备驱动程序,在内核态下调用DDK里的一个函数ULONG ExSetTimerResolution( IN ULONG DesiredTime, IN BOOLEAN SetResolution );来进行修改。应该说操作系统的时钟分辨率对于播出软件的控制精度是影响最直接和最大的,对于WINDOWS自带的NTP校时服务也有很大影响。
解决KeSetTimer定时精度不够方法
最新推荐文章于 2024-09-02 10:13:52 发布