C++、Sleep和循环

3

好的,这只是出于好奇,但是为什么在循环中睡眠函数(sleep function)不起作用,或者我该如何让它在循环中起作用?

for(int i = 0; i < 5; i++) { 
     cout << i << endl; 
     sleep(2); 
} 

1
嗯...你为什么觉得它没起作用? - T.E.D.
看起来对我来说应该可以运行...除非sleep是标准函数并且你自己写了一个。 - Dan McGrath
2
你将这个程序的输出导向另一个程序了吗? - Amber
3
Windows的sleep()函数接受一个以毫秒为单位的时间间隔--你可能没有注意到一个2毫秒的睡眠。 - Crashworks
你能发布整个源文件吗?上面的代码在cygwin和OpenBSD上工作良好,但我用了#include <unistd.h>和<iostream>。 - Amardeep AC9MF
显示剩余4条评论
6个回答

6

cout是有缓冲的,这意味着它的内容不会立即写入控制台。尝试在sleep(2);之前添加cout.flush()


26
“endl”实际上会刷新流。它的作用与“<< "\n" << flush”相同。 - Amardeep AC9MF
或者你可以使用 std::ends 来完成相同的操作,而不需要换行符。 - Konrad

1

如果那个方法对你不起作用,你可以尝试这段代码:

#include <iostream>
#include <windows.h>

...

for(int i = 0; i < 5; i++) { 
     cout << i << endl; 
     Sleep(2000); 
} 

6
考虑到问题中的Linux标签,我会认为包括<Windows.h>不是一个选择。 - BenG

0

你尝试过展开循环以查看是否表现相同吗?

cout << 1 << endl;
sleep(2);
cout << 2 << endl;
sleep(2);
// Etc.

假设行为相同,即使std::endl应该刷新缓冲区,看起来dave.kilian的想法是正确的,cout直到程序(可能)终止才被刷新。

在这种情况下,请尝试使用std::flush并查看是否有所帮助-您的标准库中可能存在错误(遗漏的功能?)。

另一个尝试的方法是将输出重定向到文件,同时在另一个窗口中使用tail -f观察。查看重定向时是否发生相同的延迟。

最后,请尝试调整编译器的优化级别,看看是否会改变结果。


0
在我谦卑的观点中,这个程序应该正常工作。也许你的std::cout被重定向到了其他地方?你没有调用正确的sleep()函数(但没有提供头文件)?或者其他问题?但它应该能够工作。

0
Dave已经给你答案了,所以我不再多说。但是,如果这纯粹是为了调试或原型代码,你也可以将输出导向std::cout的姊妹函数std::cerr,它本身就是未缓冲的。这意味着你不需要显式地调用flush,也不需要在输出中添加endl。

-2

试试使用 Sleep() 而不是 sleep()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接