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

xiv*_*r77 3 c++ qt multithreading

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

#include <QThread>
#include <QTextStream>

QTextStream qout(stdout);

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

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

MrE*_*Sir 9

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

qout << "hello world" << endl;
QThread::sleep(5);
qout << "hi again" << endl;
Run Code Online (Sandbox Code Playgroud)

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

qout << "hello world\n";
qout.flush();
QThread::sleep(5);
qout << "hi again\n";
qout.flush();
Run Code Online (Sandbox Code Playgroud)

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

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