为什么这个程序会等待10秒而不是倒计时?

时间:2015-09-03 20:35:47

标签: c++ c++11 chrono

我正在尝试一些c ++ 11代码,我尝试编写一个从10开始倒数​​的程序,在输出之间休眠。这就是我到目前为止所拥有的:

#include <iostream>
using namespace std;

#include <chrono>
#include <thread>

void Sleep(int x)
{
        std::this_thread::sleep_for(std::chrono::duration<int>(x));
}

int main()
{
    for (int x=10; x>0; x--) {
            cout << x << "...";
            Sleep(1);
    }

    cout << " FIRE!!\n";
}

问题是,这段代码会等待10秒然后打印所有输出,而不是从10开始倒计时。这是怎么回事?我该如何解决?

(顺便说一下,我在运行Linux Mint 17和MacOSX 10.9的计算机上试过这个,两次都得到了相同的结果)

2 个答案:

答案 0 :(得分:10)

可能是因为您没有刷新输出。试试这个

cout << x << "..." << flush;

可以缓冲流输出,这意味着结果并不总是立即显示。刷新至少会增加你立即看到一些输出的机会。

答案 1 :(得分:1)

每次循环时都需要刷新输出,否则运行时系统将等待缓冲区已满或(有时)要发送的行结束。

此外,使用std::chrono::duration<>时,如果可能,最好使用其中一种明确定义的类型以提高可读性。在这种情况下,您将在中测量时间,因此我在您的示例中使用了std::chrono::seconds

#include <iostream>
using namespace std;

#include <chrono>
#include <thread>

void Sleep(int x)
{
    // better to use explicit types for duration
    // for readability
    std::this_thread::sleep_for(std::chrono::seconds(x));
}

int main()
{
    for(int x = 10; x > 0; x--) {
        cout << x << "..." << std::flush; // need to flush here
        Sleep(1);
    }

    cout << " FIRE!!\n";
}