C++中的 Pause()、Sleep() 和 Wait() 有什么区别
What is the difference between Pause(), Sleep() and Wait() in C++?
我一直在斯坦福大学学习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,因此您不会延迟。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- std::condition_variable::wait()如何评估给定的谓词
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- std::memory_order for std::atomic:<T>:wait
- 我想知道长双倍和双倍之间的区别
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 返回递归调用和仅递归调用的区别
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- C++中的 Pause()、Sleep() 和 Wait() 有什么区别