LINUX.ORG.RU

Qt5, не получается получить от QProcess данные которые процесс подает на stdout

 


0

1

Есть процесс, представляющий из себя программу (на перле) которая получает данные на stdin, обрабатывает их и сразу же выдает их в stdout. Мне нужно, отправляя данные в процесс, сразу же получать от него результат (из его stdout). Сам процесс работает четко, сто процентов, он проверен, и данные отправляет в stdout, но, сигнала QProcess::newData() не возникает и даже когда я пытаюсь получить вручную без сигнала данные по QProcess::readLine() или по QProcess::readAllStandardOutput или же просто QIODevice::readAll() получаю болт вместо данных. Ни сигнал QProcess::newData() не появляется, ни ручной вызов читающих методов не дает никаких данных. Но данные вываливаются из QProcess в стопицотую попытку отправить в процесс данные, только тогда появляется единый сигнал QProcess::newData(), а за тем опять простой. Я так понял что есть какая-то буферизация. Я пробовал мешать режим открытия процесса с QIODevice::Unbuffered, но все равно не помогло.

QProcess striptask;
connect( &stripTask, SIGNAL( readyRead() ), SLOT( newData() )

void SqlStripForm::newData(void) //Подсоединенный слот
{
	//Тут либо такой код
	while( stripTask.canReadLine() ) {
		plainTextEdit_2->appendPlainText( stripTask.readLine() );
	}
	//либо такой
	plainTextEdit_2->appendPlainText( stripTask.readAllStandardOutput() );
}
★★★

У меня вот такя штука работает:

        mJavaProc = new QProcess;
        mJavaProc->setProcessChannelMode(QProcess::MergedChannels);

        connect(mJavaProc, &QProcess::readyReadStandardOutput, [this](){
            while (!mJavaProc->atEnd())
                CXSimpleLog::instance()->push("Java: ", QString(mJavaProc->readLine()));
        });
        ...
        mJavaProc->start(path, args);

staseg ★★★★★
()
Ответ на: комментарий от panter_dsd
QStringList parameters;
stripTask.setProgram("perl");
parameters << "sqlstrip.pl" << "UTF8";
stripTask.setArguments( parameters );
...
stripTask.start();
normann ★★★
() автор топика

Ура, мужики, все заработало, сам решил. Проблема была в том что оказывается вывод программ на perl начинает буферизоваться если его перенаправлять при запуске. Так что об отправке сообщенй я вас обманул т.к. сам был в заблуждении и прошу меня простить. В скрипте запретил буферизацию и все пошло поехало.

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

Всем спасибо.

normann ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.