2017-07-03 3 views
-1

Ich versuche QProcess zu verwenden, um den Speicher zu bekommen, ich bin mit RedHat 7.3, wenn ich öffnen Sie ein Terminal und geben Sie frei, das gibt mir:Qt QProcess erhalten Speicher Information

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

Ich habe versucht, das gleiche in QT zu produzieren:

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

Allerdings funktioniert das nicht und meine Anwendung hängt, habe ich auch versucht:

sh free 

besser Nein.

+0

Haben Sie versucht, '/ usr/bin/free' – drescherjm

+0

Just versuchte, dass, leider ist es die gleiche, hängt die Anwendung beim Starten des Prozesses. – SPlatten

+0

Sie können auch ein Zeitlimit für 'waitForFinished()' setzen und den Status des Prozesses überprüfen. – drescherjm

Antwort

0

Nach langen Herumspielen fand ich, dass das ein Kind Prozess funktioniert außerhalb des IDE, aber nicht von innen heraus es das Ausgang.

0

versuchen, etwas wie folgt aus:

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

Das ist wirklich nicht anders als mein ursprünglicher Code. – SPlatten

+0

@SPlatten: Nun, es gibt Änderungen, z.B. Unendlich Timeout, im Fehlerfall prüfen und den 'stderr' ausdrucken. BTW, hast du es getestet? – Azeem

+0

Ich habe es getestet, wie mein neuer Kommentar in meinem ursprünglichen Post zeigt, ja, es funktioniert außerhalb der IDE, aber nicht innerhalb, wie auch meinen ursprünglichen Code. – SPlatten

-1

Sie sind die synchrone API falsch verwendet wird. versuchen, die asynch ein:

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

Nachdem Sie Ihre vorgeschlagene Lösung ausprobiert haben, ist das Ergebnis identisch, es funktioniert nicht innerhalb der IDE und meine ursprüngliche Lösung tut das gleiche, ich vermute, dass es außerhalb der IDE funktioniert, wie auch meine. – SPlatten

+0

Ein weiteres Problem ist, dass der Geltungsbereich des Objekts p zerstört wird, bevor es abgeschlossen ist, es sei denn, "p" ist global oder statisch. – SPlatten

+0

@SPlatten Lebenszyklus kann einfach verwaltet werden. Einfach auf Heap zuordnen und das finalisierte Signal an deleteLater Slot anschließen. Es ist eine triviale Lösung – IlBeldus