很简单的一段C程序,不知道问题在哪

intiCurrentTime=0;intiWaitTime=0;intiNow=0;iCurrentTime=(int)GetTickCount();while((in... int iCurrentTime = 0;
int iWaitTime = 0;
int iNow = 0;

iCurrentTime = (int)GetTickCount();
while((int)GetTickCount() < (iCurrentTime+iWaitTime))
{
;
}
iNow = (int)GetTickCount();
outfile<<iNow - iCurrentTime<<endl;

程序想实现的功能是让程序停留iWaitTime毫秒后再运行,但是
iWaitTime设置为5、10、15,输出的iNow - iCurrentTime都是15,
iWaitTime设置为90,输出的iNow - iCurrentTime是94,
iWaitTime设置为100,输出的iNow - iCurrentTime是109。
这是为什么呢???
补充问一下,如果我希望程序停留5ms,有什么好的方法实现吗?
展开
 我来答
truspect
2010-09-05 · 超过13用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:41.9万
展开全部
根据我的研究,原因大概有三个:
1.GetTickCount函数的精度为毫秒,且每隔15毫秒返回一个值
测试代码:
while((iNow=(long)GetTickCount())<iCurrentTime+iWaitTime) //有的编译器int占两个字节,定义为long为了防止溢出
{
printf("%ld\n",iNow); //循环过程中的值不是连续的,间隔为15或16毫秒
}
printf("*******%ld\n",iNow); //循环退出时消耗的时间为15或16毫秒
之所以是15或16,是因为精度有限四舍五入的结果
2.如上所述,如果不进入循环体(iWaitTime为0),则执行时间只和执行语句的个数有关,如果个数较少则iNow-iCurrentTime返回的值为0,一旦进入循环体,则在循环退出时消耗时间为15到16毫秒,即无论上一次输出到没到15毫秒都将额外消耗15或16毫秒
3.iWaitTime iNow-iCurrentTime
0 0
----------------------------------
1-15 15、16
16 16、31、32
----------------------------------
17-31 31、32
32 32、46、47
----------------------------------
33-46 46、47
47 47、62、63
----------------------------------
48-62 62、63
63 63、78、79
----------------------------------
64-78 78、79
79 79、93、94
----------------------------------
...以此类推,总结出什么规律没有?至少可以用递归的方法精确到正负一
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式