QProcess を 1 Hz のタイマー スロットで実行しています。このプロセスは、Linux コマンドを呼び出し、その出力を解析するように設計されています。
問題は次のとおりです。プログラムを約 20 分間実行した後、次のエラーが発生します。
QProcessPrivate::createPipe: Cannot create pipe 0x104c0a8: Too many open files
QSocketNotifier: Invalid socket specified
理想的には、このプログラムはシステムの稼働時間全体 (数日または数週間) にわたって実行されます。
例を読んでプロセス制御に注意したと思いますが、何か見落としているかもしれません。私は Qt の Web サイトの例を使用しました。それらは私が書いたものと同じコードを使用していますが、これらは数千回ではなく、1 回だけ使用するように設計されています。最小限の例を次に示します。
class UsageStatistics : public QObject {
Q_OBJECT
public:
UsageStatistics() : process(new QProcess) {
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(getMemoryUsage()));
timer->start(1000); // one second
}
virtual ~UsageStatistics() {}
public slots:
void getMemoryUsage() {
process->start("/usr/bin/free");
if (!process->waitForFinished()) {
// error processing
}
QByteArray result = process->realAll();
// parse result
// edit, I added these
process->closeReadChannel(QProcess::StandardOutput);
process->closeReadChannel(QProcess::StandardError);
process->closeWriteChannel();
process->close();
}
}
deleting
また、関数の最後と最初にプロセス ポインターを手動で試しましnew
た。試してみる価値はあったと思います。
これに答えた人にはビールを無料で提供します :)