C ++中Pause(),Sleep()和Wait()有什么区别?

时间:2011-05-14 22:43:27

标签: c++ windows winapi

我一直在斯坦福大学完成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) {}
}

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

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

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

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

3 个答案:

答案 0 :(得分:5)

Sleep需要一个整数作为毫秒,你给它0.5,所以你等待0毫秒。您的等待函数也会占用,因此它也有同样的问题。

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

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

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

答案 1 :(得分:1)

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

Windows应用程序的工作原理是消息泵,并且该绘制是一个低优先级。

如果你在消息泵线程中睡觉或等待,则阻止它进一步处理消息,例如绘制屏幕。

您需要屈服于消息泵,以便它可以正常工作。

您可能会查看Wait for multiple的使用情况并运行第二个消息泵。 (猜测这是暂停的主体)。

答案 2 :(得分:0)

由于wait接受一个int参数,因此用0.5调用它(因为你的例子用于Pause)将导致0.5被截断为0,所以你不会得到任何延迟。