0

我正在做一个基于 snap 游戏的初学者 c++ 程序。

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

for(;;){
            if( (difftime(time(0),lastDealTime)) > 0.5f){ //half second passed
                cout << currentCard <<endl;
                lastDealTime = time(0);
                break;
            }
        }

起初我认为它有效,但后来当我试图加快发牌过程时,我意识到将控制值更改为 0.5(我的目标是每半秒发一次牌)似乎没有任何效果。 .我尝试将其更改为每 0.05 秒处理一次,但没有任何区别,我猜卡片似乎仍然每秒输出一次。

关于为什么这不起作用的任何观察?谢谢!

4

4 回答 4

2

的分辨率time()是一秒——即,返回值是整数秒。您永远不会看到不到一秒钟的差异。

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

于 2012-01-31T11:55:55.550 回答
1

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

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

于 2012-01-31T11:59:54.167 回答
1

如果您想确保卡片按照您要求的间隔准确发牌,那么您可能也应该创建一个计时器类。我们用:

在 Windows 中,使用QueryPerformanceFrequency获取系统滴答时间,使用QueryPerformanceCounter获取滴答声

在 Mac Carbon 上,使用 DurationToAbsolute 获取系统滴答时间,使用 UpTime 获取滴答声。

在 Linux 上使用clock_gettime

用于睡眠:

一个 Windows 使用 Sleep();

在 Mac Carbon 上使用 MPDelayUntil();

在 Linux 上使用 nanosleep();

于 2012-01-31T12:18:50.867 回答
1

从我的角度来看,您的代码的最大问题不是您没有找到单平台版本的睡眠,而是睡眠实际上是为了让 CPU 在一段时间内停止处理,而是您的不会停止处理,您的应用程序将占用大量资源。

当然,如果您的计算机专用于仅运行一个应用程序,这可能并不重要,但现在我们希望我们的计算机能够做的不仅仅是一件事。

于 2012-01-31T12:37:58.023 回答