Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: aasedov от Октябрь 26, 2011, 23:44



Название: Не могу читать данные от QProcess в реальном времени
Отправлено: aasedov от Октябрь 26, 2011, 23:44
Здравствуйте! Моя проблема состоит в следующем.
Есть констольное приложение (не Qt, и даже не C++), которое общается с операторам, выводя ему сообщения через stdout, и запрашивая от него данные через stdin (собственно, как и все такие приложения). Я попытался запустить его из-под Qt-программы, используя класс QProcess, и наладить общение моей программы и данного приложения.
Проблема оказалась в том, что сигналы QProcess::readyReadStandartOutput() и QIODevice::readyRead() высылаются только в двух случаях: при завершении работы запущенного с помощью QProcess приложения (непосредственно перед посылкой сигнала QProcess::finished() ), либо при приближении объема выведенных через stdout данных к 1 МБ! Попытки читать данные не дожидаясь сигнала, используя функции чтения QProcess и QIODevice также ни к чему не привели, всё как будто бы пусто. Установка флага QIODevice::Unbuffered в QIODevice::OpenMode для объекта процесса также ничего не дала.
Мне нужно наладить получение от запущенной программы коротких сообщений в две-три строки для последующего анализа до того, как запущенная программа даже подумает завершиться. Но пока получается принимать только большие объемы текстовых данных.
Помогите пожалуйста!


Название: Re: Не могу читать данные от QProcess в реальном времени
Отправлено: andrew.k от Октябрь 26, 2011, 23:48
видимо она их так отправляет большими кусками.
Делал подобное таких проблем не было.


Название: Re: Не могу читать данные от QProcess в реальном времени
Отправлено: aasedov от Октябрь 26, 2011, 23:54
Я знаю, КАК она их отправляет. Первое сообщение в три строки отправляется сразу после запуска (еще до ввода каких-либо данных), но в вызывающей программе полная тишина.
Кстати - ввод через stdin работает нормально (сообщения доходят до приложения).


Название: Re: Не могу читать данные от QProcess в реальном времени
Отправлено: thechicho от Октябрь 27, 2011, 23:00
// Я знаю, КАК она их отправляет
А ЧО СПРАШИВАЕШЬ ТОГДА? ;D


Название: Re: Не могу читать данные от QProcess в реальном времени
Отправлено: kamre от Октябрь 28, 2011, 11:22
Я знаю, КАК она их отправляет. Первое сообщение в три строки отправляется сразу после запуска (еще до ввода каких-либо данных), но в вызывающей программе полная тишина.
Скорее всего это проблема с буферизацией вывода, когда вывод делается не на экран.

Что будет если запустить программу с перенаправлением вывода в файл? Там сразу появляются эти три строчки?

Если нет, то программа должна делать flush для stdout в тех местах, где сообщение нужно обязательно показать.


Название: Re: Не могу читать данные от QProcess в реальном времени
Отправлено: aasedov от Октябрь 29, 2011, 19:33
Скорее всего это проблема с буферизацией вывода, когда вывод делается не на экран.

Что будет если запустить программу с перенаправлением вывода в файл? Там сразу появляются эти три строчки?

Если нет, то программа должна делать flush для stdout в тех местах, где сообщение нужно обязательно показать.
Я об этом уже думал. Жаль, что функция flush реализована не в классе QIODevice, а только в некоторых его потомках (например в QFile).

Проблема в том, что программ, которые мне нужно запускать таким образом, не одна. Написаны они на разных языках, исходники некоторых давно потеряны...

А за совет с перенаправлением в файл - спасибо. Сам попробовать почему-то не догадался  :)


Название: Re: Не могу читать данные от QProcess в реальном времени
Отправлено: GreatSnake от Октябрь 30, 2011, 12:45
2 aasedov :
Почему не указываешь какая платформа ??? И как запускаешь?


Название: Re: Не могу читать данные от QProcess в реальном времени
Отправлено: andrew.k от Октябрь 30, 2011, 13:12
2 aasedov :
Почему не указываешь какая платформа ??? И как запускаешь?
Чтобы форумчане развивали фантазию и интуицию. ;D


Название: Re: Не могу читать данные от QProcess в реальном времени
Отправлено: kamre от Октябрь 30, 2011, 14:10
Чтобы форумчане развивали фантазию и интуицию. ;D
Развиваю: платформа винда, есть куча exe-шников, от которых даже исходники потеряны )
И проблема очень похожа на bug в Eclipse CDT (https://bugs.eclipse.org/bugs/show_bug.cgi?id=173732).


Название: Re: Не могу читать данные от QProcess в реальном времени
Отправлено: GreatSnake от Октябрь 30, 2011, 14:35
Чтобы форумчане развивали фантазию и интуицию. ;D
Развиваю: платформа винда, есть куча exe-шников, от которых даже исходники потеряны )
И проблема очень похожа на bug в Eclipse CDT (https://bugs.eclipse.org/bugs/show_bug.cgi?id=173732).
Ну там же всё сказано, поэтому QProcess тебе не поможет - нужно всё делать самому через WinAPI :(


Название: Re: Не могу читать данные от QProcess в реальном времени
Отправлено: aasedov от Октябрь 30, 2011, 16:58
Чтобы форумчане развивали фантазию и интуицию. ;D
Развиваю: платформа винда, есть куча exe-шников, от которых даже исходники потеряны )
И проблема очень похожа на bug в Eclipse CDT (https://bugs.eclipse.org/bugs/show_bug.cgi?id=173732).
Я не очень силен с английским. Поясните пожалуйста коротко, в чем суть указанной проблемы?

Ну там же всё сказано, поэтому QProcess тебе не поможет - нужно всё делать самому через WinAPI :(
Вот этого то я и боялся :(


Название: Re: Не могу читать данные от QProcess в реальном времени
Отправлено: andrew.k от Октябрь 30, 2011, 18:59
Сдается мне, что только симптомы одинаковые, а заболевания разные.
Это разные проблемы.
Можно предложить выложить сюда этот самый бинарник, чтобы желающие попробовали.
Может сложится другая картина.