Добрый день, Коллеги. Пожалуйста, помогите выйти из тупика: Работаю в 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);
}