#c #multithreading #qt #cout #qdebug
Вопрос:
У меня есть такой код, как следующий:
std::cout << "Beginning computations..."; // output 1
computations();
std::cout << " done!n"; // output 2
Проблема, однако, заключается в том, что часто вывод № 1 и вывод № 2 появляются (практически) одновременно. То есть часто вывод #1 не выводится на экран до тех пор, пока computations()
не вернется. Поскольку вся цель вывода № 1 состоит в том, чтобы указать, что что-то происходит в фоновом режиме (и, таким образом, поощрять терпение пользователя), эта проблема не является хорошей.
Есть ли какой-либо способ заставить std::cout
буфер распечатываться перед computations()
вызовом? В качестве альтернативы, есть ли какой-то другой способ (используя что-то другое, кроме std::cout
) для печати в стандартном режиме, который мог бы решить эту проблему?
Комментарии:
1. Я слышал
std::endl
, что это довольно популярно для такого рода вещей…2. @ebyrob, Но это приведет к завершению строки, и если он хочет продолжить печать в той же строке после вычисления, ему нужно вручную выполнить очистку.
3. @leemes это очень верно. В этом случае он может либо использовать
fprintf()
std::flush
(как показано ниже), либо изменить свою версиюcout
, чтобы автоматически сбрасывать в конце каждой строки кода… У меня была такая нить для этого последнего, но, похоже, я ее потерял.4. @synaptik с чем ты сталкиваешься, с чем я не сталкиваюсь. все работает нормально. Я только что создал
computation
функцию с однойcout
строкой. но это необходимо сделать перед вызовом функции."Beginning computations..."
но мне нужно найти, в каком конкретном случае буфер не будет свободным.
Ответ №1:
Просто вставьте std::flush
:
std::cout << "Beginning computations..." << std::flush;
Также обратите внимание, что вставка std::endl
также будет удалена после ввода новой строки.
Комментарии:
1. @user1810087 Извините, я отредактировал его, но довольно быстро. Я думаю, это было до того, как ты ответил.
2. Мне понравились комментарии 😀
3. @JosephMansfield но в моем случае этого не происходит, значит, нет необходимости использовать
std::flush
. можете ли вы привести случай, когда буфер не заполнен, поэтомуcout
печать не выполняется.
Ответ №2:
В дополнение к ответу Джозефа Мэнсфилда, std::endl также выполняет сброс (помимо новой строки).
Вставляет символ конечной строки в выходную последовательность os и очищает ее, как будто вызывая os.put(os.widen(‘n’)), за которым следует os.флеш().