cout with this_thread :: sleep_for?

时间:2017-11-04 19:31:25

标签: c++ multithreading cout

我正在使用this_thread::sleep_for()进行测试来创建一个与cout类似的对象,除非打印字符串时每个字符之间的延迟时间很短。但是,不是在每个字符之间等待0.1秒,而是等待大约一秒钟,然后立即打印所有字符。这是我的代码:

#include <iostream>
#include <chrono>
#include <thread>

class OutputObject
{
    int speed;
public:
    template<typename T>
    void operator<<(T out)
    {
        std::cout << out;
    }
    void operator<<(const char *out)
    {
        int i = 0;
        while(out[i])
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(speed));
            std::cout << out[i];
            ++i;
        }
    }
    void operator=(int s)
    {
        speed = s;
    }
};

int main(int argc, char **argv)
{
    OutputObject out;
    out = 100;
    out << "Hello, World!\n";
    std::cin.get();
    return 0;
}

知道我做错了吗?

编辑:CoryKramer指出std :: flush是实时行动所必需的。通过将std::cout << out[i];更改为std::cout << out[i] << std::flush;,我解决了我的问题!

1 个答案:

答案 0 :(得分:2)

Streams有缓冲区,因此cout在刷新流之前不会打印文本,例如endl刷新流并添加'\n'也会调用cin自动刷新缓冲流中的数据。试着用这个:

while(out[i])
{
   std::this_thread::sleep_for(std::chrono::milliseconds(speed));
   std::cout << out[i];
   std::cout.flush();
   ++i;
}