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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: есть ли класс реализующий QIODevice через stdin stdout?  (Прочитано 9163 раз)
unkeep
Гость
« : Сентябрь 16, 2015, 14:19 »

есть ли класс реализующий QIODevice через stdin stdout?

нужно чтоб write(QByteArray) работал через stdout,
readyRead(), readAll() - stdin
« Последнее редактирование: Сентябрь 17, 2015, 10:41 от unkeep » Записан
Johnik
Крякер
****
Online Online

Сообщений: 339


Просмотр профиля
« Ответ #1 : Сентябрь 16, 2015, 14:31 »

bool QFile::open(FILE * fh, OpenMode mode)
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Сентябрь 17, 2015, 09:40 »

Текстовый поток тоже работает с stdin и stdout. Думаю, что и QDataStream тоже.
Записан
unkeep
Гость
« Ответ #3 : Сентябрь 17, 2015, 10:56 »


почему-то не возбуждается сигнал QIODevice::readyRead. (Данные пишутся в дочерний процесс)
проект во вложении
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Сентябрь 17, 2015, 11:04 »

Тут у вас в релиз версии файл не откроется
Код
C++ (Qt)
Q_ASSERT(_in->open(stdin, QIODevice::ReadOnly));
Вам нужно сигналы ловить от _childProc
Код
C++ (Qt)
connect(_childProc, SIGNAL(readyRead), SLOT(onReadyRead));
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Сентябрь 17, 2015, 11:05 »

А ещё, в вашем случае, будет лучше читать поток через QProcess::readAllStandardOutput()
Записан
unkeep
Гость
« Ответ #6 : Сентябрь 17, 2015, 11:12 »

Тут у вас в релиз версии файл не откроется
Код
C++ (Qt)
Q_ASSERT(_in->open(stdin, QIODevice::ReadOnly));
Вам нужно сигналы ловить от _childProc
Код
C++ (Qt)
connect(_childProc, SIGNAL(readyRead), SLOT(onReadyRead));

секундочку... почему от _childProc? Родительский процесс шлёт данные дочернему. В дочернем процессе через stdin я надеюсь их услышать и прочитать.
Записан
unkeep
Гость
« Ответ #7 : Сентябрь 17, 2015, 11:18 »

Текстовый поток тоже работает с stdin и stdout. Думаю, что и QDataStream тоже.

Текстовый поток не подойдёт, слаться будут сериализованные объекты. QDataStream не работает с stdin и stdout.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Сентябрь 17, 2015, 13:39 »

Заметил ещё один момент. Посылайте
Код
C++ (Qt)
_childProc->write("qwerty\n");

Давайте предположим, что ваш дочерний процесс это обычный cmd в винде.
Что будет, если вы в командной строке напишете qwerty? Ничего не произойдёт, строка будет дожидаться дальнейшего ввода. Но после того, как вы нажимаете Enter ('\n'), начинается обработка введённой строки. Также и в вашем случае.
Ещё момент. Вы шлёте процессу данные через класс QProcess, все ответы тоже приходят в него. Думаю, что логично использовать для всех операций с дочерним процессом именно QProcess.
Записан
unkeep
Гость
« Ответ #9 : Сентябрь 17, 2015, 14:11 »

Цитировать
Давайте предположим, что ваш дочерний процесс это обычный cmd в винде. Что будет, если вы в командной строке напишете qwerty? Ничего не произойдёт, строка будет дожидаться дальнейшего ввода.

cmd - оперирует строками. Для него строка - одна команда. Соответственно он будет ждать символа конца строки. Я делал app на подобие cmd (консольное приложение). Использовал в нём QTextStream. И так же ждал от стандартного потока ввода строки, чтоб выполнить действие. А мог бы и реагировать по каждому посланному байту, не суть...

Сейчас задача другая, наладить межпроцессную коммуникацию. Одно приложение запускает другое. Родительское имеет связь с дочерним через объект QProcess, который реализует интерфейс QIODevice. Для него пофиг что ему пишут в поток, строку или картинку.

Цитировать
Ещё момент. Вы шлёте процессу данные через класс QProcess, все ответы тоже приходят в него. Думаю, что логично использовать для всех операций с дочерним процессом именно QProcess.
Тут Вы меня вообще не правильно понимаете. Да я шлю процессу данные через класс QProcess, но зачем мне в том же приложении из этого же процесса их считывать?! Эти данные нужны в дочернем приложении. Эти два приложения - два узла, они работают в разных процессах, каждый со своей памятью.
Давайте представим что мои приложения работают на разных компьютерах и должны общаться по сети. Мы же не будем писать данные в сокет компьютера1 и вычитывать их из того же сокета?
Записан
unkeep
Гость
« Ответ #10 : Сентябрь 17, 2015, 15:27 »


почему-то не возбуждается сигнал QIODevice::readyRead. (Данные пишутся в дочерний процесс)
проект во вложении

Наконец-то то-я понял причину. В документации QFile сказано:
Цитировать
Unlike other QIODevice implementations, such as QTcpSocket, QFile does not emit the aboutToClose(), bytesWritten(), or readyRead() signals. This implementation detail means that QFile is not suitable for reading and writing certain types of files, such as device files on Unix platforms.
бесполезно слушать readyRead().


Исходный вопрос остаётся открытым:
есть ли класс реализующий QIODevice через stdin stdout?
нужно чтоб write(QByteArray) работал через stdout,
readyRead(), readAll() - stdin

.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #11 : Сентябрь 17, 2015, 17:12 »

Ну а чем QProcess не угодил то?
Записан

ArchLinux x86_64 / Win10 64 bit
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #12 : Сентябрь 17, 2015, 17:34 »

Не относитесь к процессу как к файлу. Если я что-то пишу, то это пишется в stdin, если я что-то читаю, то это читается из stdout или stderr
Записан
unkeep
Гость
« Ответ #13 : Сентябрь 17, 2015, 18:29 »

Ну а чем QProcess не угодил то?

я перерыл кучу форумов по этому вопросу, и русских и английских, и в каждом есть человек который бегло пробежав по теме, пишет вот точно такое же сообщение)))

Ещё раз. QProcess у меня есть в родительском приложении. С помощью него я могу писать\читать данные в stdin\stdout\stderr  дочернего процесса. А в дочернем приложении, которое ничего не знает про родительское и про QProcess, есть только stdin/stdout/stderr с которыми я надеялся асинхронно работать через интерфейс QIODevice.

Вообщем ситуация пока такая: нет реализации с помощью которой можно асинхронно читать\писать из std потоков. (На этом форуме есть тема, в которой сваяли нечто-подобное в отдельном потоке... Но эта реализация меня не устраивает.). Посему для межпроцессного общения я решил использовать QLocalSocket, а не QProcess в связке с iosteram.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #14 : Сентябрь 18, 2015, 09:28 »

Вы можете привести небольшой пример задачи, которая требовала бы подобной реализации?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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