Название: 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 пишет? Попробуйте так: Код
Название: 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 |