Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Paul от Август 04, 2014, 17:09



Название: QProcess от start до finish (новое о старом ???)
Отправлено: Paul от Август 04, 2014, 17:09
Добрый день, Коллеги. Пожалуйста, помогите выйти из тупика: Работаю в QT 4.6 под Linux c устройством, управляемым по
протоколу SNMP. Вручную, из командной строки, используя компоненты библиотеки SNMP snmpget, snmpwalk и snmpset,
управляю им свободно. Перенёс это управление в свою прогу, используя QProcess. Для snmpget и snmpwalk - всё ОК, а вот
для snmpset ответ в slotReadResponseFromStdout() не получаю.
Вот как это выглядит у меня:

MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{
...
  processForSNMP = new QProcess(this);
  if (processForSNMP)
  {
    connect(processForSNMP, SIGNAL(readyReadStandardOutput()), this, SLOT(slotReadResponseFromStdout()));
    connect(processForSNMP, SIGNAL(error(QProcess::ProcessError)), this, SLOT(slotProcErrror(QProcess::ProcessError)));
    connect(processForSNMP, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotEndProcess(int, QProcess::ExitStatus)));
  }
}

int MainWindow::processExec(QString &prog, QStringList &par)
{
  int     res = 0;
  processForSNMP->start(prog, par);
  if (!processForSNMP->waitForStarted(3000))
    res = 1;
  else
    if (!processForSNMP->waitForFinished(3000))
      res = 2;
  if (res == 2)
  {
    if (processForSNMP->state() == QProcess::Running)
    {
      //подождём ещё...
      if (processForSNMP->waitForFinished(3000))
        res = 0;
    }
  }
  //  if (res)
  {
    QString st = "?????????????????";
    switch (processForSNMP->state())
    {
      case QProcess::Running    : st = "Running"; break;
      case QProcess::NotRunning : st = "NotRunning"; break;
      case QProcess::Starting   : st = "Starting"; break;
    }
  qDebug() << "MainWindow::processExec process->state()=" << st; 
  return res;
}

void MainWindow::slotReadResponseFromStdout()
{
  if (processForSNMP)
  {
    QByteArray ba = processForSNMP->readAll();
    activePowerSource.response = true;
    QString s;
    s = QString(ba);
    activePowerSource.res = s;
qDebug() << "MainWindow::slotReadResponseFromStdout readAll()=" << s;
  }
}

void MainWindow::slotProcErrror(QProcess::ProcessError err)
{
  QString s;
  switch (err)
  {
    case QProcess::FailedToStart: s = "Ошибка запуска процесса. Программа не найдена или к ней нет доступа"; break;
    case QProcess::Crashed      : s = "Крах программы после запуска"; break;
    case QProcess::Timedout     : s = "Превышение времени ожидания для последнего waitFo..."; break;
    case QProcess::WriteError   : s = "Ошибка записи в процесс"; break;
    case QProcess::ReadError    : s = "Ошибка чтения из процесса"; break;
    case QProcess::UnknownError : s = "Неизвестная ошибка"; break;
    default: s = "Неизвестная ошибка";
  }
  QString mes = QString::fromUtf8("Ошибка выполнения процесса код %1\n%2 !!!").arg(err).arg(s);
  QMessageBox::critical(NULL, appTitle, mes);
}


Название: Re: QProcess от start до finish (новое о старом ???)
Отправлено: Kurles от Август 04, 2014, 18:20
1. код ваш смотерть не возможно из-за форматирования - используйте тэг code.
2. может проблема в том, что snmpset в stderr пишет? Попробуйте так:
Код
C++ (Qt)
// skip
processForSNMP = new QProcess(this);
processForSNMP->ProcessChannelMode(QProcess::MergedChannels);
// skip
 


Название: Re: QProcess от start до finish (новое о старом ???)
Отправлено: Paul от Август 04, 2014, 21:50
Спасибо, Kurles, за внимание.

Собака порылась вот где: я использовал process->start(QString prog, QStringlist par),
а после перехода на process->start(QString prog) ручеек побежал...

В snmpset последними параметрами задаются тип и значение данного и в 1-ом варианте start
при формировании командной строки где-то косячит, я это обнаружил, когда пытался заменить start на
execute.

С уважением, Paul