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 ответа:
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; }