Russian Qt Forum
Ноябрь 23, 2024, 03:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу читать данные от QProcess в реальном времени  (Прочитано 7138 раз)
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 для объекта процесса также ничего не дала.
Мне нужно наладить получение от запущенной программы коротких сообщений в две-три строки для последующего анализа до того, как запущенная программа даже подумает завершиться. Но пока получается принимать только большие объемы текстовых данных.
Помогите пожалуйста!
Записан
andrew.k
Гость
« Ответ #1 : Октябрь 26, 2011, 23:48 »

видимо она их так отправляет большими кусками.
Делал подобное таких проблем не было.
Записан
aasedov
Гость
« Ответ #2 : Октябрь 26, 2011, 23:54 »

Я знаю, КАК она их отправляет. Первое сообщение в три строки отправляется сразу после запуска (еще до ввода каких-либо данных), но в вызывающей программе полная тишина.
Кстати - ввод через stdin работает нормально (сообщения доходят до приложения).
Записан
thechicho
Гость
« Ответ #3 : Октябрь 27, 2011, 23:00 »

// Я знаю, КАК она их отправляет
А ЧО СПРАШИВАЕШЬ ТОГДА? Смеющийся
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #4 : Октябрь 28, 2011, 11:22 »

Я знаю, КАК она их отправляет. Первое сообщение в три строки отправляется сразу после запуска (еще до ввода каких-либо данных), но в вызывающей программе полная тишина.
Скорее всего это проблема с буферизацией вывода, когда вывод делается не на экран.

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

Если нет, то программа должна делать flush для stdout в тех местах, где сообщение нужно обязательно показать.
Записан
aasedov
Гость
« Ответ #5 : Октябрь 29, 2011, 19:33 »

Скорее всего это проблема с буферизацией вывода, когда вывод делается не на экран.

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

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

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

А за совет с перенаправлением в файл - спасибо. Сам попробовать почему-то не догадался  Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Октябрь 30, 2011, 12:45 »

2 aasedov :
Почему не указываешь какая платформа Непонимающий И как запускаешь?
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #7 : Октябрь 30, 2011, 13:12 »

2 aasedov :
Почему не указываешь какая платформа Непонимающий И как запускаешь?
Чтобы форумчане развивали фантазию и интуицию. Смеющийся
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #8 : Октябрь 30, 2011, 14:10 »

Чтобы форумчане развивали фантазию и интуицию. Смеющийся
Развиваю: платформа винда, есть куча exe-шников, от которых даже исходники потеряны )
И проблема очень похожа на bug в Eclipse CDT.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Октябрь 30, 2011, 14:35 »

Чтобы форумчане развивали фантазию и интуицию. Смеющийся
Развиваю: платформа винда, есть куча exe-шников, от которых даже исходники потеряны )
И проблема очень похожа на bug в Eclipse CDT.
Ну там же всё сказано, поэтому QProcess тебе не поможет - нужно всё делать самому через WinAPI Грустный
Записан

Qt 5.11/4.8.7 (X11/Win)
aasedov
Гость
« Ответ #10 : Октябрь 30, 2011, 16:58 »

Чтобы форумчане развивали фантазию и интуицию. Смеющийся
Развиваю: платформа винда, есть куча exe-шников, от которых даже исходники потеряны )
И проблема очень похожа на bug в Eclipse CDT.
Я не очень силен с английским. Поясните пожалуйста коротко, в чем суть указанной проблемы?

Ну там же всё сказано, поэтому QProcess тебе не поможет - нужно всё делать самому через WinAPI Грустный
Вот этого то я и боялся Грустный
Записан
andrew.k
Гость
« Ответ #11 : Октябрь 30, 2011, 18:59 »

Сдается мне, что только симптомы одинаковые, а заболевания разные.
Это разные проблемы.
Можно предложить выложить сюда этот самый бинарник, чтобы желающие попробовали.
Может сложится другая картина.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.