QT返回shell命令结果非阻塞

QT返回shell命令结果非阻塞,qt,qprocess,Qt,Qprocess,在qt im中,尝试运行以下shell命令: arp | grep -i 'test' 我目前拥有以下代码: QString Network::getMac(){ QProcess sh; sh.start("sh"); sh.waitForStarted(); sh.write("arp -n| grep -i 'test'"); sh.closeWriteChannel(); sh.wa

在qt im中,尝试运行以下shell命令:

 arp | grep -i 'test'
我目前拥有以下代码:

QString Network::getMac(){
     QProcess sh;
     sh.start("sh");
     sh.waitForStarted();
     sh.write("arp  -n| grep -i 'test'");
     sh.closeWriteChannel();
     sh.waitForFinished();
     QString line=  sh.readAll().replace("\n","").toLower();
     return line;
}
我想使用mac电脑,例如:

  QString mac = objectOfClassThatHasTheFunction->getMac();
它工作得非常好,但问题是它需要很长时间,并且会阻塞prorgram。 文档中说,
waitForFinished阻塞,直到进程完成并发出finished()信号,或者直到毫秒过去。
但是如何在不阻塞的情况下返回结果呢? 当我想使用结果时,如何在不阻塞的情况下运行QProcess

我可以通过使用arp-n来加速进程,但我想知道如何正确使用qprocess。

*bool qprocess::StartDetailed(qint64 pid=nullptr)

您的\u类::您的\u插槽是可以获得标准输出的插槽

注意“sh”变量的范围。如果在函数中声明,它可能会被销毁。

如果确实必须等待结果,则可以使用事件循环(未测试)

不过,一般来说,你应该联系各种各样的问题并采取行动。如果不进行错误检查,它可能会像

void Network::getMac ()
{
  auto *sh = QProcess;
  QObject::connect(&sh, &QProcess::started,
                   [sh]()
                   {

                     /*
                      * The process has started so write the command.
                      */
                      sh->write("arp  -n| grep -i 'test'");
                   });
  QObject::connect(&sh, &QProcess::finished,
                   [sh]()
                   {

                     /*
                      * The process has finished so fetch and use the
                      * data.
                      */
                     QString line = sh->readAll().replace("\n","").toLower();
                     process(line);

                     /*
                      * The QProcess `sh' was new'd so we need to make
                      * sure it's deleted when control is returned to
                      * the event loop.
                      */
                     sh->deleteLater();
                   });
  sh->start("sh");
}

我看到了qprocess的插槽信号,但是如何从函数调用返回它呢?这样,就不需要返回它了。在插槽中,只需使用:sh.readAllStandardOutput()。当您在stdout上获得一些文本,并仅显示或处理它时,将异步调用插槽。我想返回它,例如QString mac=someClass->getMac();你有三种方法:1。阻塞主线程,直到从执行的进程中获取信息。你实现了它。2.不阻塞主线程,如第一个G.M.示例。3.异步,如我的示例中所示。这样,您将在插槽中接收所需的内容,并连接到readyReadStandardOutput信号。该信号将在shell命令输出某些内容时随时发出。这是您将接收数据的地方。我想返回结果,如果不需要等待就可以了,那就更好了。我真的不明白您所说的
“…如果不需要等待就可以返回结果…”
。这个命令需要有限的时间来完成——这是无法回避的。使用本地
QEventLoop
允许Qt在等待
QProcess
完成时处理其他事件。抱歉,如果我误解了这个问题。抱歉,这是对“如果你真的必须等待结果”的回答。我以为你是在暗示不需要等待。
QString Network::getMac ()
{
  QProcess sh;
  QEventLoop el;
  QObject::connect(&sh, &QProcess::started, &el, &QEventLoop::quit);
  sh.start("sh");
  el.exec();
  QObject::connect(&sh, &QProcess::finished, &el, &QEventLoop::quit);
  sh.write("arp  -n| grep -i 'test'");
  el.exec();
  QString line = sh.readAll().replace("\n","").toLower();
  return line;
}
void Network::getMac ()
{
  auto *sh = QProcess;
  QObject::connect(&sh, &QProcess::started,
                   [sh]()
                   {

                     /*
                      * The process has started so write the command.
                      */
                      sh->write("arp  -n| grep -i 'test'");
                   });
  QObject::connect(&sh, &QProcess::finished,
                   [sh]()
                   {

                     /*
                      * The process has finished so fetch and use the
                      * data.
                      */
                     QString line = sh->readAll().replace("\n","").toLower();
                     process(line);

                     /*
                      * The QProcess `sh' was new'd so we need to make
                      * sure it's deleted when control is returned to
                      * the event loop.
                      */
                     sh->deleteLater();
                   });
  sh->start("sh");
}