QT返回shell命令结果非阻塞
在qt im中,尝试运行以下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
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");
}