crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 22:14