我正在做一个基于snap游戏的入门c++程序。
当我将卡片对象输出到控制台时,由于计算机的处理速度自然很快,所以会出现已发牌的完整列表。我想,如果我能在每一张牌之间暂停一下,这样人类就能真正观察到每张牌都在发,那就好了。因为我总是同时在Linux和Windows上工作,并且已经包含了,所以我想出了这个小解决方案:
for(;;){
if( (difftime(time(0),lastDealTime)) > 0.5f){ //half second passed
cout << currentCard <<endl;
lastDealTime = time(0);
break;
}
}起初,我认为它起作用了,但后来当我试图加快交易过程时,我意识到更改控制值0.5 (我的目标是每半秒进行一次牌交易)似乎没有任何效果。我试着把它改成每0.05秒发一次牌,结果没什么区别,我猜似乎每秒都有牌输出。
有什么关于为什么这不会起作用的观察吗?谢谢!
发布于 2012-01-31 19:59:54
time()和difftime()的分辨率为1秒,无法使用它们来管理小于1秒的间隔;即使间隔为1秒,它们也不可用,因为抖动也可能高达1秒。
在这种情况下,解决方案是定义某种类型的定时器类,在头文件中具有独立于系统的接口,但源文件依赖于系统;根据系统的不同,您可以编译一个源文件或另一个源文件。Windows和Linux都有更高分辨率的时间管理方法。
发布于 2012-01-31 19:55:56
time()的分辨率是1秒--即返回值是一个整数秒。你永远看不到少于一秒的差异。
usleep()位于标准C库中--它的分辨率以微秒为单位,因此请改用微秒。
发布于 2012-01-31 20:18:51
如果您想确保这些卡在您请求的时间间隔内进行精确的处理,那么您可能也应该创建一个timer类。我们使用:
在Windows中,使用QueryPerformanceFrequency获取系统计时,使用QueryPerformanceCounter获取计时。
在Mac上,使用DurationToAbsolute获取系统计时,使用UpTime获取计时。
在Linux上使用clock_gettime。
对于睡眠使用:
一个窗口使用睡眠();
在Mac Carbon上使用MPDelayUntil();
在Linux上使用nanosleep();
https://stackoverflow.com/questions/9079055
复制相似问题