Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Majestio от Ноябрь 29, 2013, 13:56



Название: QProcess + STDIN/STDOUT
Отправлено: Majestio от Ноябрь 29, 2013, 13:56
Вопрос №1: нужно запустить процесс, предварительно записав ему в STDIN некоторые данные, получить из его STDOUT результат, ну и использовать их в своей программе. Накидал частично работающий код, дальше тупичек. Нужна ваша помощь.

Слот из программы, пока просто вызывается кликом педали на форме:
Код:
void MainWindow::SlotRun()
{
    QProcess *P = new QProcess();
    // как записать процессу в его STDIN пару текстовых строк???
    P->setReadChannelMode(QProcess::MergedChannels);
    P->start(tr("cmd.exe"),QStringList() << tr("/c") << QCoreApplication::applicationDirPath()+"/StartHidden.cmd" << tr("Argument"));
    P->waitForFinished();
    QTextCodec *Cp866 = QTextCodec::codecForName("IBM 866");
    qDebug() << Cp866->toUnicode(P->readAllStandardOutput());
}

Данный код вызывает, как пример, StartHidden.cmd:
Код
@echo off
sort
ping 192.168.1.2
echo Result: %1
 

Естественно, если я sort не закомментирую - вызов зависает. А мне нужно чтобы sort отсортировал переданные ему строки.

Вопрос №2:
Код:
QTextCodec *Cp866 = QTextCodec::codecForName("IBM 866");
Программа работает в UTF-8, а как узнать в какой кодировке работает консольное приложение?




Название: Re: QProcess + STDIN/STDOUT
Отправлено: VPS от Ноябрь 29, 2013, 14:58
Что Вы пытаетеь отсортировать командой sort в cmd файле?
Если хотите отсортировать вывод команды ping, то попробуйте вот так:
Код:
ping 192.168.1.2 | sort


Название: Re: QProcess + STDIN/STDOUT
Отправлено: Majestio от Ноябрь 29, 2013, 15:07
Что Вы пытаетеь отсортировать командой sort в cmd файле?
Если хотите отсортировать вывод команды ping, то попробуйте вот так:
Код:
ping 192.168.1.2 | sort

Нет, это просто первый пример, который пришел на ум - команда sort, которая умеет сортировать то, что ей приходит на STDIN. На счет пайпов, я в курсе.

А в приведенном примере должно отработать так:
1) Выводятся отсортированные строки, переданные мною из Qt-программы
2) За ними выводится результат работы пинг
3) Выводится аргумент, переданный cmd-файлу

Понимаю, бессмыслица, но это только для примера.


Название: Re: QProcess + STDIN/STDOUT
Отправлено: VPS от Ноябрь 29, 2013, 16:51
А в приведенном примере должно отработать так:
1) Выводятся отсортированные строки, переданные мною из Qt-программы
2) За ними выводится результат работы пинг
3) Выводится аргумент, переданный cmd-файлу

Понимаю, бессмыслица, но это только для примера.

Попробуйте так:
Код:
   QProcess proc;
   proc.setReadChannelMode(QProcess::MergedChannels);
   QStringList args;
   args << QObject::tr("/c")
          << QObject::tr("c:/temp/111.cmd")
          << QObject::tr("Argument");
   proc.start(QObject::tr("cmd"), args);

   QString strings("string3\nstring2\nstring1");
   proc.write(strings.toAscii());
   proc.closeWriteChannel();
   proc.waitForFinished();

   QTextCodec *Cp866 = QTextCodec::codecForName("IBM 866");
   qDebug() << Cp866->toUnicode(proc.readAllStandardOutput());

   return 0;


Название: Re: QProcess + STDIN/STDOUT
Отправлено: Majestio от Ноябрь 29, 2013, 18:06
Спасибо - то, что надо! Только .toAscii метод не нашелся, но сработал следующий код:
Код:
void MainWindow::SlotRun()
{
    qDebug() << "Start";
    QProcess *P = new QProcess();
    P->setReadChannelMode(QProcess::MergedChannels);
    P->start(tr("cmd.exe"),QStringList() << tr("/c") << QCoreApplication::applicationDirPath()+"/StartHidden.cmd" << tr("Argument"));
    QString strings("String4\nString2\nString3\nString1");
    P->write(strings.toLocal8Bit());
    P->closeWriteChannel();
    P->waitForFinished();
    QTextCodec *Cp866 = QTextCodec::codecForName("IBM 866");
    qDebug() << Cp866->toUnicode(P->readAllStandardOutput());
    qDebug() << "Stop";
}
Все сортируется, все выводится.
Вопрос закрыт :)