大家注意:
   我想了一个办法,使定时器既可以达到较短定时时间间隔,又可以较小的占用系统资源.
我的思路是先让一个精度不高,但系统资源占用率小的延时函数延时一回,再让一个精度高,但系统资源占用率大的函数上.
具体是利用Sleep(0)的误差,我发现Sleep(0)的误差只可能是正数,而且大约是13微秒.
   我可以先让Sleep(0)延时一回,再调用QueryPerformanceCounter()确定时间.这样如果把时延设为20微秒.就可以达到很高的精度,而系统的资源占用率也不会超过60%,但时延最小只能为15微秒.请大家给点意见或建议!!谢谢!!
请看代码:
//注意!!这个函数我以设为对话框的成员函数
LARGE_INTEGER CHtDlg::MySleep(LARGE_INTEGER Interval)
{
LARGE_INTEGER privious, current, Elapse; 
 
QueryPerformanceCounter( &privious ); 
current = privious;Sleep(0);
do{
QueryPerformanceCounter( &current ); 
}
while( current.QuadPart - privious.QuadPart < Interval.QuadPart ) ;Elapse.QuadPart = current.QuadPart - privious.QuadPart; 
/*
DWORD pr,cu;
LARGE_INTEGER Elapse;
pr=(DWORD)GetTickCount();
cu=pr;
while(cu-pr<(DWORD)Interval.QuadPart)
cu=GetTickCount();
Elapse.QuadPart=cu-pr;
*/
 
return Elapse; 
}

解决方案 »

  1.   

    怀疑:
    Sleep(0)是否只是执行了指令周期,因为Sleep函数本身是毫秒级的,如果Sleep(0)是否只是执行了指令周期,那和随便执行一个函数的效果(如i++;)一样,即这种方法与机器的指令周期相关,不能作为定时器使用;建议在不同机器上(cpu相差很多的机器)测试一下。
      

  2.   

    请注意cpu的占用率,我这个只有50%
      

  3.   

    十分怀疑Sleep(0);
    不知道在任务繁重的情况下效果如何?
      

  4.   

    对不起!我又试了一下.发现系统资源占用率达到了100%.理论上也应该是这样.
    不过我又想到了一个主意,就是用延时后你想执行的代码来代替Sleep(0)函数(前提是你的代码执行时间不应超过你想延时的时间),这样虽然系统100%的负荷,但有相当一部分是在工作,而不是白白的
    浪费在延时上.但这样你的执行代码之间的时间间隔会不一样.这就好像是一队人排队,每个人的身高都不一样,但他们都站在同一水平面上.
      

  5.   


    问题是定时器需要一个相对标准的时间,即不论是在 286 或是在 P4 上运行,1毫秒的误差必须在可接受范围内,我不请楚Sleep内部如何处理,应该是取机器时钟周期来计算,如果你仅依靠指令周期作延时,那你的程序根本无法通用举个例子:Sleep(1000),在286 或是在 P4 上都是延时1秒钟(误差很小),但按你的方法,两者间的延时可能要差几十倍甚至更多