1

我在解析/proc/statQt 时遇到问题。

我遇到的问题是QFile状态/proc/stat既开放可读。

尝试单独读取行时,QTextStream显然指示流已完成,但我知道通过运行cat /proc/stat.

没有while执行循环中的代码。有什么意见或建议吗?

  int UsageStatistics::handle_timeout(const ACE_Time_Value& currentTime, const void* param) {

        INFO("Handling timeout\n");

        QFile file(QString("/proc/stat"));
        if (!file.open(QIODevice::ReadOnly)) {
            ERROR("Unable to open file %s, aborting\n", file.fileName().toStdString().c_str());
            return false;
        }                 

        if (!file.isReadable()) {
            ERROR("Unable to read file %s, aborting\n", file.fileName().toStdString().c_str());
            return false;
        }



        QTextStream in(&file);            
        while (!in.atEnd()) {
            QString line = in.readLine();        

            INFO("%s\n", line.toStdString().c_str());

             /// processing
        }

        file.close();

        return true;          
    }
4

2 回答 2

6

/proc/stat 是一个很小的文件,没有变大的风险。只需在 QByteArray 中执行 readAll()(没有 atEnd() 检查,您已经完成了 isReadable()),然后如果您想以相同的方式解析它,则将 QTextStream 指向字节数组。

QFile file(QString("/proc/stat"));
if (!file.open(QIODevice::ReadOnly)) {
    qDebug("Unable to open file %s, aborting\n", 
        qPrintable(file.fileName()));
    ui->plainTextEdit->appendPlainText("Error can't open");
    return;
}

if (!file.isReadable()) {
    qDebug("Unable to read file %s, aborting\n", 
        qPrintable(file.fileName()));
    ui->plainTextEdit->appendPlainText("Error can't read");
    return;
}

QByteArray contents = file.readAll();

QTextStream in(&contents);
while (!in.atEnd()) {
    QString line = in.readLine();

    qDebug("Read: %s\n", qPrintable(line));

    ui->plainTextEdit->appendPlainText(line);
}

ui->plainTextEdit->appendPlainText("Done reading.");

file.close();

我刚刚验证了我的系统和你的系统一样,然后尝试了这个基于 readAll() 的方法并且它有效。

于 2013-04-16T16:45:23.990 回答
0

您正在使用cpuRegex.exactMatch,它希望与整行完全匹配。您要查找的线路也有其他信息。尝试cpuRegex.indexIn(line) == 0改用。

于 2013-04-16T14:40:09.967 回答