大家注意:
我想了一个办法,使定时器既可以达到较短定时时间间隔,又可以较小的占用系统资源.
我的思路是先让一个精度不高,但系统资源占用率小的延时函数延时一回,再让一个精度高,但系统资源占用率大的函数上.
具体是利用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( ¤t );
}
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;
}
我想了一个办法,使定时器既可以达到较短定时时间间隔,又可以较小的占用系统资源.
我的思路是先让一个精度不高,但系统资源占用率小的延时函数延时一回,再让一个精度高,但系统资源占用率大的函数上.
具体是利用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( ¤t );
}
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;
}
解决方案 »
- 请问如何使一个添加到按钮控件上的picture控件(加载了ICON图标)一直显示。我在对话框的初始化函数中做了如下
- 为什么我的VC 6.0中用类向导定义成员变量时,组合框只能定义int行变量,而不能定义CString 变量啊?
- 如何去掉属性页中的帮助按钮?或者重载也行
- 为什么编辑框背景透明以后,backspace键光标是退格了,可字符没删掉啊?
- 关于使用VC6编译连接时黑屏问题,超常郁闷,请求帮助!!!!!!
- 如何在程序中运行一个exe文件??
- 使用XML DOM对象遇到可怕的问题,谁能帮我?
- 我的第一份计算机工作总结,大家看了,不要丢鸡蛋哦!:)
- 基于特征的人脸检测
- VC++中如何修改RectTracker的属性使得选中某一对象后图元后的效果很好看
- 100分在线等待简单问题。
- 关于CGridCtrl的问题
Sleep(0)是否只是执行了指令周期,因为Sleep函数本身是毫秒级的,如果Sleep(0)是否只是执行了指令周期,那和随便执行一个函数的效果(如i++;)一样,即这种方法与机器的指令周期相关,不能作为定时器使用;建议在不同机器上(cpu相差很多的机器)测试一下。
不知道在任务繁重的情况下效果如何?
不过我又想到了一个主意,就是用延时后你想执行的代码来代替Sleep(0)函数(前提是你的代码执行时间不应超过你想延时的时间),这样虽然系统100%的负荷,但有相当一部分是在工作,而不是白白的
浪费在延时上.但这样你的执行代码之间的时间间隔会不一样.这就好像是一队人排队,每个人的身高都不一样,但他们都站在同一水平面上.
问题是定时器需要一个相对标准的时间,即不论是在 286 或是在 P4 上运行,1毫秒的误差必须在可接受范围内,我不请楚Sleep内部如何处理,应该是取机器时钟周期来计算,如果你仅依靠指令周期作延时,那你的程序根本无法通用举个例子:Sleep(1000),在286 或是在 P4 上都是延时1秒钟(误差很小),但按你的方法,两者间的延时可能要差几十倍甚至更多