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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QProcess + STDIN/STDOUT  (Прочитано 6523 раз)
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, а как узнать в какой кодировке работает консольное приложение?


Записан
VPS
Гость
« Ответ #1 : Ноябрь 29, 2013, 14:58 »

Что Вы пытаетеь отсортировать командой sort в cmd файле?
Если хотите отсортировать вывод команды ping, то попробуйте вот так:
Код:
ping 192.168.1.2 | sort
Записан
Majestio
Гость
« Ответ #2 : Ноябрь 29, 2013, 15:07 »

Что Вы пытаетеь отсортировать командой sort в cmd файле?
Если хотите отсортировать вывод команды ping, то попробуйте вот так:
Код:
ping 192.168.1.2 | sort

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

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

Понимаю, бессмыслица, но это только для примера.
« Последнее редактирование: Ноябрь 29, 2013, 15:10 от Majestio » Записан
VPS
Гость
« Ответ #3 : Ноябрь 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;
Записан
Majestio
Гость
« Ответ #4 : Ноябрь 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";
}
Все сортируется, все выводится.
Вопрос закрыт Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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