首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我试着想出一个跨平台的方法来代替sleep(),但是我的代码并不是很有效

问我试着想出一个跨平台的方法来代替sleep(),但是我的代码并不是很有效
EN

Stack Overflow用户
提问于 2012-01-31 19:51:35
回答 4查看 310关注 0票数 0

我正在做一个基于snap游戏的入门c++程序。

当我将卡片对象输出到控制台时,由于计算机的处理速度自然很快,所以会出现已发牌的完整列表。我想,如果我能在每一张牌之间暂停一下,这样人类就能真正观察到每张牌都在发,那就好了。因为我总是同时在Linux和Windows上工作,并且已经包含了,所以我想出了这个小解决方案:

代码语言:javascript
复制
for(;;){
            if( (difftime(time(0),lastDealTime)) > 0.5f){ //half second passed
                cout << currentCard <<endl;
                lastDealTime = time(0);
                break;
            }
        }

起初,我认为它起作用了,但后来当我试图加快交易过程时,我意识到更改控制值0.5 (我的目标是每半秒进行一次牌交易)似乎没有任何效果。我试着把它改成每0.05秒发一次牌,结果没什么区别,我猜似乎每秒都有牌输出。

有什么关于为什么这不会起作用的观察吗?谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-31 19:59:54

time()和difftime()的分辨率为1秒,无法使用它们来管理小于1秒的间隔;即使间隔为1秒,它们也不可用,因为抖动也可能高达1秒。

在这种情况下,解决方案是定义某种类型的定时器类,在头文件中具有独立于系统的接口,但源文件依赖于系统;根据系统的不同,您可以编译一个源文件或另一个源文件。Windows和Linux都有更高分辨率的时间管理方法。

票数 1
EN

Stack Overflow用户

发布于 2012-01-31 19:55:56

time()的分辨率是1秒--即返回值是一个整数秒。你永远看不到少于一秒的差异。

usleep()位于标准C库中--它的分辨率以微秒为单位,因此请改用微秒。

票数 2
EN

Stack Overflow用户

发布于 2012-01-31 20:18:51

如果您想确保这些卡在您请求的时间间隔内进行精确的处理,那么您可能也应该创建一个timer类。我们使用:

在Windows中,使用QueryPerformanceFrequency获取系统计时,使用QueryPerformanceCounter获取计时。

在Mac上,使用DurationToAbsolute获取系统计时,使用UpTime获取计时。

在Linux上使用clock_gettime。

对于睡眠使用:

一个窗口使用睡眠();

在Mac Carbon上使用MPDelayUntil();

在Linux上使用nanosleep();

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9079055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档