【问题标题】:How come this program waits 10 seconds instead of counting down?为什么这个程序等待 10 秒而不是倒计时?
【发布时间】:2015-09-03 20:35:46
【问题描述】:

我正在尝试一些 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 的计算机上尝试过这个,两次都得到了相同的结果)

【问题讨论】:

  • 您的 cout 已“缓存”(不知道如何更正确地调用它)。在睡眠前调用 std::cout.flush()
  • @Creris 通常的词是“缓冲”。
  • @T.C.谢谢,现在脑子已经半睡半醒了,所以想不出那个词
  • I/O 不会自动刷新,因为这可能很昂贵(就性能而言)......

标签: c++ c++11 chrono


【解决方案1】:

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

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

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

【讨论】:

  • 它有效,谢谢!但是我怎么每次都要刷cout呢?
  • @Dovahkiin: iostream(cout 是 stdout 的一个实例)和其他 I/O 库被缓冲。 flush 命令在缓冲数据正常运行之前将其推出。默认情况下,在大多数平台上,当您打印 '\n' 时,cout 会自动刷新。
  • 如果每个输出都立即完成,那么输出的整体效率会降低。相反,输出是缓冲的,直到准备好写入足够大的数据块时才会发生。大多数时候这并不重要,但如果你想立即看到输出,那么你必须使用flush。
  • 这很有道理,我猜。谢谢! +1
  • @Dovahkiin “谢谢!+1”如果它解决了你的问题,你也应该考虑接受这个答案。
【解决方案2】:

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

此外,当使用std::chrono::duration&lt;&gt; 时,如果可能为了可读性,最好使用显式定义的类型之一。在这种情况下,您以 秒 为单位测量时间,因此我在您的示例中使用了 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";
}

【讨论】:

    猜你喜欢
    • 2021-08-24
    • 2020-04-17
    • 2021-12-19
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多