2017-07-03 201 views
-1

我试图使用QProcess中获得的记忆,我使用的是RedHat 7.3,如果我打开一个终端输入免费,这给了我:Qt的QProcess中获取内存信息

  total  used  free  shared buff/cache available 
Mem:  7865728  1602988  3984928  297040  2277812  5552268 
Swap:  8126460   0  8126460 

我试着产生相同的QT:

QProcess p; 
p.start("free"); 
p.waitForFinished(); 
QString strMemory = p.readAllStandardOutput(); 
qDebug() << strMemory; 
p.close(); 

然而,这并不工作,我的应用程序挂起,我也试着:

sh free 

没有好转。

+0

你尝试'在/ usr/bin中/ free' – drescherjm

+0

只是去尝试,起动过程中,当不幸的是相同的,应用程序挂起。 – SPlatten

+0

您可能还想对'waitForFinished()'进行时间限制并检查进程的状态。 – drescherjm

回答

0

多玩弄我发现启动子进程外工作的IDE而不是从内它之后。

0

尝试这样:

const QString command { "free" }; 

QProcess p {}; 
p.start(command); 
if (!p.waitForFinished(-1)) 
{ 
    qWarning() << "Error:" << p.readAllStandardError(); 
    return; 
} 

const auto& output = p.readAllStandardOutput(); 
qDebug() << "Output:" << output; 
+0

这真的和我原来的代码没什么不同。 – SPlatten

+0

@SPlatten:好吧,有一些变化,例如无限超时,检查错误并打印'stderr'。顺便说一句,你测试了吗? – Azeem

+0

我测试过它,因为我在原始文章中的新评论显示,是的,它在IDE之外工作,但不在我的原始代码中。 – SPlatten

-1

您正在使用同步API错误。尝试非同步之一:

QProcess p; 
QString strMemory; 
QObject::connect(&p,&QProcess::readyReadStandardOutput,[&strMemory,&p]()->void{strMemory += QString::fromLatin1(p.readAllStandardOutput());}); 
QObject::connect(&p,&QProcess::readyReadStandardError,[&strMemory,&p]()->void{strMemory += QString::fromLatin1(p.readAllStandardError());}); 
QObject::connect(&p,static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),[&strMemory]()->void{qDebug() << strMemory;}); 
p.start("free"); 
+0

尝试过你提出的解决方案,其结果是相同的,它不会从IDE中的工作和我原来的解决方案不一样,我怀疑它会一样矿IDE之外工作。 – SPlatten

+0

另一个问题是对象p的作用域在它完成之前会被销毁,除非'p'是全局或静态的。 – SPlatten

+0

@SPlatten生命周期可以轻松管理。只需在堆上分配并将完成的信号连接到deleteLater插槽即可。这是一个小小的更正 – IlBeldus