C++中的 Pause()、Sleep() 和 Wait() 有什么区别

What is the difference between Pause(), Sleep() and Wait() in C++?

本文关键字:Wait 区别 什么 中的 Pause C++ Sleep      更新时间:2023-10-16

我一直在斯坦福大学学习CS106B课程,在完成Boggle作业时,我注意到Windows上的Sleep()函数与Pause()函数的行为不同。 出于测试目的,我只是设置了开发板并使用提供的gboggle.h文件突出显示了Boggle立方体,然后删除了突出显示。 以下是相关代码:

for(int row = 0; row < board.numRows(); row++)
{
    for(int col = 0; col < board.numCols(); col++)
    {
        HighlightCube(row, col, true);
    }
}
Pause(0.5);
for(int row = 0; row < board.numRows(); row++)
{
    for(int col = 0; col < board.numCols(); col++)
    {
        HighlightCube(row, col, false);
    }
}

如果我使用 Pause(),立方体会突出显示,然后恢复正常。 如果我使用 Sleep() 或 Wait(),立方体永远不会突出显示,并且程序中的延迟发生在绘制板之前,而不是在 for 循环之间。 相关的 Wait() 函数:

void wait ( int seconds )
{
  clock_t endwait;
  endwait = clock () + seconds * CLOCKS_PER_SEC ;
  while (clock() < endwait) {}
}

取自这里。 我在Windows XP上使用Visual Studio 2005。

这些功能之间的区别是什么导致它们以这种方式行事?

编辑:我知道睡眠和等待需要整数。 我已经使用整数测试了它们并看到了延迟,但它发生在写入正方形之前。 对不起,我以前不清楚。

Edit2:在浏览了我使用的其他一些库后,我发现暂停实际上是图形库的一部分,它只是暂停图形缓冲区。

睡眠想要一个整数作为毫秒,你给它 0.5,所以你等待 0 毫秒。您的等待函数也采用整数,因此它有相同的问题。

此外,您的等待功能正在阻塞。只要您在等待,您的应用程序就会繁忙并使用 CPU 进行等待。而 Windows Sleep 函数会挂起当前线程,这意味着您的应用程序实际上什么都不做(不使用任何 CPU 资源),直到时间结束。

编辑:我不知道Pause是做什么的,因为它不是WinAPI函数。

编辑:可能是,首先看到HighlightCube的结果,当应用程序返回到其事件循环,然后绘制这些立方体时。这样,您只需突出显示它们,然后等待,然后取消突出显示它们。然后你的函数返回,应用程序最终绘制它们。这是很明显的,因为睡眠(以及您的等待)只是阻止应用程序处理任何事件(包括窗口绘制事件)。我想暂停通过检查回事件循环来防止这种情况。实际上,这就是Greg Domjan已经写过的。

我以前从未见过 Pause 命令;也许你可以为它提供一些代码?

Windows应用程序基于消息泵的想法,并且绘画是低优先级的。

如果您在消息泵线程中休眠或等待,则会阻止它对消息进行任何进一步的处理,例如绘制屏幕。

您需要屈服于消息泵,以便它可以完成它的工作。

您可以查看"等待多个"和运行第二个消息泵的使用情况。(猜测这是暂停的身体)。

由于 wait 采用 int 参数,因此使用 0.5 调用它(如您用于Pause的示例)将导致 0.5 被截断为 0,因此您不会延迟。