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

acm*_*har 4 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

void wait ( int seconds )
{
  clock_t endwait;
  endwait = clock () + seconds * CLOCKS_PER_SEC ;
  while (clock() < endwait) {}
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑2:在浏览了我使用的其他一些库之后,我发现Pause实际上是暂停图形缓冲区的图形库的一部分.

Chr*_*ica 5

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

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

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

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