QTextStream在QThread :: sleep()之前不写

时间:2014-11-18 04:39:15

标签: c++ multithreading qt

预计"嗨再次"在" hello world"之后5秒出现在控制台上。但实际上,控制台是空的5秒钟,然后我可以看到这两个消息。我该怎么做才能获得预期的结果?

#include <QThread>
#include <QTextStream>

QTextStream qout(stdout);

int main()
{
    qout << "hello world\n";
    QThread::sleep(5);
    qout << "hi again\n";
    return 0;
}

//&#34;多线程&#34;标签就在那里,因为我在编写多线程程序时发现了这个问题,并且该解决方案可以应用于多线程应用程序。

2 个答案:

答案 0 :(得分:9)

QTextStream不会自动刷新换行符上的缓冲区。这里最简单的解决方案是使用endl,它会添加一个换行符并为你调用flush():

qout << "hello world" << endl;
QThread::sleep(5);
qout << "hi again" << endl;

当然,您可以手动调用flush():

qout << "hello world\n";
qout.flush();
QThread::sleep(5);
qout << "hi again\n";
qout.flush();

根据您的使用情况,另一种可能性是依赖于QTextStream的析构函数调用flush()。

{
    QTextStream qout(stdout);
    qout << "hello world\n";
}
QThread::sleep(5);
{
    QTextStream qout(stdout);
    qout << "hi again\n";
}

答案 1 :(得分:3)

问题与多线程无关。原因是您的输入存储在缓冲数据中,尚未写入stdout。为了强制流写入数据,请在sleep()=)之前调用QTextStream :: flush()

#include <QThread>
#include <QTextStream>

QTextStream qout(stdout);
int main()
{
    qout << "hello world\n";
    qout.flush();

    QThread::sleep(5);
    qout << "hi again\n";
    qout.flush();

    return 0;
}