Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема со стандартными потоками IO в qt 4
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
Illin
Версия qt - 4.4.3.
Новичок в qt
Проблема в следующем: есть программа, которой надо послать в стандартный поток ввода данные и получить ответ через стандартный поток вывод
Для записи в поток использовал метод write - программа ничего не получает.
panter_dsd
Побольше конкретики и кода.
Гость
Цитата(panter_dsd @ 26.10.2010, 12:23) *
Побольше конкретики и кода.

Раскрывающийся текст
class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    QProcess proc;
private slots:
    void on_pbSendText_clicked();
    void on_pbStopProcess_clicked();
    void on_pbStartProcess_clicked();
    void showStdOut();
    void showErrOut();
    void processStoped(int _exitCode);
    void timerTime();
};


Раскрывающийся текст
QString prog = "/usr/test_console/test_console";

Dialog::Dialog(QWidget *parent)
    : QDialog(parent), ui(new Ui::Dialog)
{
    ui->setupUi(this);
    connect(&proc, SIGNAL(readyReadStandardOutput()), this, SLOT(showStdOut()));
    connect(&proc, SIGNAL(readyReadStandardError()), this, SLOT(showErrOut()));
    connect(&proc, SIGNAL(finished(int)), this, SLOT(processStoped(int)));
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(timerTime()));
    timer->start();
}

Dialog::~Dialog()
{
    delete ui;
    proc.terminate();
}

void Dialog::on_pbStartProcess_clicked()
{

  QStringList arg;
  proc.setProcessChannelMode(QProcess::MergedChannels);
  proc.start(prog, arg, QIODevice::ReadWrite | QIODevice::Unbuffered);
  if(proc.waitForStarted())
    {
      ui->pteStdOut->appendPlainText(QString("рТПГЕУУ: %1 ЪБРХЭЕО").arg(prog));
      ui->pteStdOut->appendPlainText(proc.readAllStandardOutput());
      ui->pbStartProcess->setEnabled(false);
      ui->pbStopProcess->setEnabled(true);
    }
  else
    {
      ui->pteStdOut->appendPlainText(QString("оЕ ЪБРХУЛБЕФУС РТПГЕУУ: %1").arg(prog));
      ui->pbStartProcess->setEnabled(true);
      ui->pbStopProcess->setEnabled(false);
    }

}

void Dialog::on_pbStopProcess_clicked()
{
  if(proc.state() == QProcess::Running)
  {
     proc.terminate();
     ui->pteStdOut->appendPlainText(QString("рТПГЕУУ: %1 ПУФБОПЧМЕО").arg(prog));
     ui->pbStartProcess->setEnabled(true);
     ui->pbStopProcess->setEnabled(false);
  }
}

void Dialog::on_pbSendText_clicked()
{
  QByteArray data = Convert::StringToBytes(ui->leSendText->text());
  proc.write(data);
}

void Dialog::showStdOut()
{
  ui->pteStdOut->appendPlainText(Convert::BytesToString(proc.readAllStandardOutput()));
}

void Dialog::showErrOut()
{
  ui->pteErrOut->appendPlainText(QString::fromLocal8Bit(proc.readAllStandardError()));
}

void Dialog::processStoped(int _exitCode)
{
     ui->pbStartProcess->setEnabled(true);
     ui->pbStopProcess->setEnabled(false);
}

void Dialog::timerTime()
{

}
panter_dsd
1. Что в переменной prog?
2. Что есть Convert::BytesToString?
Litkevich Yuriy
Цитата(panter_dsd @ 26.10.2010, 15:23) *
Побольше конкретики и кода.
+1
Illin
в переменной prog - программа, которая должна получать данные
BytesToString - преобразование массива байт в строку по определенному алгоритму.
Это ведь все не очень важно. Дело в том, что proc.write(data) не вызывает никаких реакций у программы
panter_dsd
А программа prog точно ловит стандартный инпут?
Litkevich Yuriy
Гость_Illin_*, давай свой код, приёма данных из стандартного ввода
Illin
Да. Точно. Проверено сторонней программой. Да и к самой программе есть описание.
А можно какой-нить пример использования write(). В qt3 было проще - там был writeToStdin().
Может есть какие-нить особенности при использовании write()?
ernie
может проблема в QString?скажем в сокет её напрямую нельзя писать,если правильно помню,попробуй вместо QString скажем int отправить,какой результат будет?
Litkevich Yuriy
Цитата(ernie @ 26.10.2010, 16:02) *
может проблема в QString?скажем в сокет её напрямую нельзя писать,если правильно помню,попробуй вместо QString скажем int отправить,какой результат будет?
да чё гадать. Код надо.
Illin
Цитата(ernie @ 26.10.2010, 13:02) *
может проблема в QString?скажем в сокет её напрямую нельзя писать,если правильно помню,попробуй вместо QString скажем int отправить,какой результат будет?


Гм. Так я вроде QByteArray посылаю. А кода программы нет.
Гость
Litkevich Yuriy,
Подскажите, пожалуйста. Каким образом проверить, осуществилась ли запись в стандартный поток ввода, то есть выполнился ли мой prog.write()?
Litkevich Yuriy
Цитата(Гость_Illin_* @ 26.10.2010, 16:06) *
А кода программы нет.
как так?
Illin
Цитата(Litkevich Yuriy @ 26.10.2010, 13:23) *
Цитата(Гость_Illin_* @ 26.10.2010, 16:06) *
А кода программы нет.
как так?



Программа чужая. Код своей программы я выложил выше.

P.S. Можно, если есть, выложить пример кода работы с QProcess (желательно с тестовым приложением)?
kwisp
Цитата(Гость_Illin_* @ 26.10.2010, 14:29) *
P.S. Можно, если есть, выложить пример кода работы с QProcess

уже давно выложили
тут
+
поищи по форуму QProcess - многое найдёшь.
Illin
Это все я читал. Хочетцася рабочий пример.
Illin
Даже очень нужен рабочий пример...
Litkevich Yuriy
Цитата(Гость_Illin_* @ 26.10.2010, 16:54) *
Даже очень нужен рабочий пример...
ну вот под рукой есть код - работа с git'ом:
Раскрывающийся текст
YGit::YGit(QObject* p_parent)
    :QObject(p_parent)
    ,out(stdout)
    ,error(stderr)
{
    process = new QProcess(this);

    outCodec = QTextCodec::codecForName("IBM866");
    out.setCodec(outCodec);    
    error.setCodec(outCodec);
}

//...

bool YGit::checkout(QString name)
{

    QString outString;
    name = QDir::fromNativeSeparators(name);
    QString cmd = QString("%1\\git checkout %2").arg(m_gitPath).arg(name);

/*    out << "Creat Process:" << cmd;
    out.flush();*/
    
    cmd = cmd.toUtf8();
    
    process->setProcessChannelMode(QProcess::MergedChannels);
    process->start(cmd);
    if (!process->waitForStarted()){
        error << " - may not started" << endl << flush;
        return false;
    }

    QTime t;
    t.start();

    int sec = 1000; // 1000 ms
    int min = 60* sec; // 60 s
    int maxtime = 3*min;
    
    while(1){
        if (process->waitForReadyRead(maxtime)){
            outString += QString::fromUtf8(process->readAllStandardOutput().data());
            t.restart();
        }
        if (process->state() != QProcess::Running){
            if (process->exitCode() == 0){
                return true;
            }else{
                out << outString << flush;
                qDebug() << "Process" << cmd << "finished with error";
                return false;
            }
        }
        if (t.elapsed() >= maxtime){
            error << " - may not finished" << endl << flush;
            return false;
        }
    }

}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.