我正在1赫兹的计时器插槽中运行QProcess。该过程旨在唤起Linux命令并解析其输出。QProcess,无法创建管道
问题是这样的:节目约20分钟一班后,我得到这个错误:
QProcessPrivate::createPipe: Cannot create pipe 0x104c0a8: Too many open files
QSocketNotifier: Invalid socket specified
理想的情况下,该程序将运行在系统的整个运行时间,这可能是数天或数周。
我想我已经通过阅读示例小心处理过程控制,但也许我错过了一些东西。我使用了Qt网站的示例,它们使用了我编写的相同代码,但这些代码是为单次使用而设计的,而不是数千次。下面是一个最小例如:
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
开头。我想这是值得一试的。
免费啤酒谁回答了这个:)
您在某处泄漏句柄,或者您同时启动了太多QProcess-es。看到https://bugreports.qt-project.org/browse/QTBUG-18934 – sashoalm 2013-04-26 13:44:22
这不是你的问题的答案,但如果你的目标是要找出系统中有多少内存是空闲的,我建议完全避免QProcess并使用更轻量级的机制,如fopen(“/ proc/meminfo”,“r”),并直接读出数据。效率更高,错误更少:) – 2013-04-26 14:47:09