QTextStream не пишет Перед QThread:: sleep()


Ожидалось, что "привет снова" появится на консоли через 5 секунд после "hello world". Но на самом деле консоль была пуста в течение 5 секунд, и после этого я мог видеть оба сообщения. Что я должен сделать, чтобы получить ожидаемый результат?

#include <QThread>
#include <QTextStream>

QTextStream qout(stdout);

int main()
{
    qout << "hello worldn";
    QThread::sleep(5);
    qout << "hi againn";
    return 0;
}

// тег "многопоточность" существует, так как я обнаружил эту проблему во время написания многопоточной программы, и что решение может быть применено к многопоточным приложениям.

2 3

2 ответа:

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";
}

Проблема не связана с многопоточностью. Причина в том, что ваши входные данные хранятся в буферных данных, которые еще не были записаны в stdout. Для того, чтобы заставить поток, чтобы записать свои данные, пожалуйста, позвоните 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;
}