crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в QTextStream, operator<< работает асинхронно?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
ViGOur Дата 13.10.2008, 11:11
  Спасибо, за подробную подсказку. :)
Tonal Дата 13.10.2008, 8:28
  out и err - это разные файлы, каждый со своей стратегией буферизации.
В stderr буферизация по умолчанию отключена, в stdout нет.
Отсюда и странный эффект. :)
Litkevich Yuriy Дата 13.10.2008, 8:21
  Tonal, обрати внимание: в моем примере все три строчки вЫвод, вВода нет! а последовательность нарушена.
Tonal Дата 13.10.2008, 8:12
  Тут не в асинхронности дело. :)
Дело в том, что in и out - это разные файла, со своими буферами.
Т.е. при выводе сначала идёт накопление буфера, и только когда он заполнен его единым блоком выкидывают в устройство.
Для ввода примерно так же, только наоборот: из устройство читают блок данных в буфер, а потом программа выбирает уже из буфера. Как только она прочла всё, процесс повторяется.

Иногда это не то, что ожидается, тогда можно поступать несколькими способами:
1. После вывода сбрасывать буфера принудительно (ключевое слово flush)
2. При создании объекта файла указать что буфера использовать не нужно
3. Для С++ потоков, есть механизм "связывания" файлов (ключевое слово tie). Если с потоком ввода связан поток вывода, буфер потока вывода сбрасывается перед каждой операцией ввода.
Для С файлов тоже что-то подобное вроде есть. Для Qt - не в курсе. :)
Litkevich Yuriy Дата 7.10.2008, 22:49
  да уж для меня тоже загадка, код:
#include <QtCore>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTextStream err(stderr);
    QTextStream out(stdout);
    QTextStream in(stdin);
    QString cmdline;
    QString pharse;
    QDir    dir;

qDebug() << "Test_to_qDebug-1";
    out << "Test_to_out";
qDebug() << "Test_to_qDebug-2";

    return 0;
}


вывод в консоль:
D:\tempData\Qt-test\release>tst
Test_to_qDebug-1
Test_to_qDebug-2
Test_to_out
++Norton++ Дата 7.10.2008, 22:41
 
Цитата(ViGOur @ 7.10.2008, 23:37) *
Может просто operator<< работает асинхронно?


А как можно это исправить? Чтобы в правильном порядке все выполнялось?
ViGOur Дата 7.10.2008, 22:37
  Может просто operator<< работает асинхронно?
++Norton++ Дата 7.10.2008, 22:31
  Хотелось бы спросить здесь же, чтобы не создавать такой глупой темы, но все же (простите за оффтоп). Допустим есть 2 строки:
 out << "virtual@" << mkddr.dir.absolutePath() << " $ ";
    cmdline = in.readLine();

Почему сначала считывается строка (in.readLine()) и только потом выводится (out << "virtual@".....) хотя вроде должно все быть наоборот? Как можно сделать так, чтобы сначала выводилось на экран: virtual@... а только потом считывалось in.readLine()?

----
Отделено от темы Ошибка mkdir()
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.4.2024, 9:28