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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QProcess от start до finish (новое о старом ???)  (Прочитано 3095 раз)
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);
}
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1 : Август 04, 2014, 18:20 »

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

Код
C++ (Qt)
while(!asleep()) sheep++;
Paul
Гость
« Ответ #2 : Август 04, 2014, 21:50 »

Спасибо, Kurles, за внимание.

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

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

С уважением, Paul
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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