首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从慢QXMLStreamreader读取QProcess

从慢QXMLStreamreader读取QProcess
EN

Stack Overflow用户
提问于 2013-12-02 15:19:08
回答 1查看 325关注 0票数 0

在QT5.1中,QXMLStreamReader在等待QProcess生成更多数据时遇到了问题。

如果我从未缓冲的QProcess中读取行,它可以正常工作:

代码语言:javascript
复制
while(!vupProcess.state() == QProcess::NotRunning)
{
    if (vupProcess.atEnd())
    {
        vupProcess.waitForReadyRead();
    }
    qDebug() << vupProcess.readLine();
}

很明显:当缓冲区没有数据时,它会等待更多的数据。当有更多,它将打印线,而不等待。

现在,如果我想对QXMLStreamReader进行同样的处理,它可以工作,但是处理XML元素的时机是错误的(太晚了)。

考虑到这一点:

代码语言:javascript
复制
QXmlStreamReader xml;
xml.setDevice(&vupProcess);
QStack<VUPDevice *> deviceStack;
QXmlStreamReader::TokenType tokenType = QXmlStreamReader::NoToken;

while (tokenType != QXmlStreamReader::EndDocument && !xml.hasError())
{
    if (xml.device()->atEnd())
    {
        xml.device()->waitForReadyRead(XML_READNEXT_TIMEOUT);
    }

    tokenType = xml.readNext();

    if (xml.hasError())
    {
        qDebug() << "ERROR";
        return;
    }

    ...
}

在调用waitForReadyRead(int)时,许多元素已经可用,我需要处理它们来更新GUI。但是,在QProcess开始输出更多的(更多的)之前,它不会继续。这似乎是因为底层的QProcess被尽可能快地读取,直到它为空,然后我的解析器在早期阶段不必要地挂起,因为QProcess不再输出。

我需要的是xml.hasMoreElements(),这样我就可以:

代码语言:javascript
复制
if (xml.device()->atEnd() && !xml.hasMoreElements())
{
    xml.device()->waitForReadyRead(XML_READNEXT_TIMEOUT);
}

但我似乎找不到一个API调用来为我做到这一点。

那么,当数据不是必需的时候,我怎么不等待更多的数据呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-02 19:45:25

我想我解决了。没有方法来询问是否有更多的XML元素,但是readNext()调用将使QXMLStreamReader对象处于您可以检测到的状态,并用于让后端设备等待:

代码语言:javascript
复制
QXmlStreamReader::TokenType tokenType = xml.readNext();

while (xml.error() == QXmlStreamReader::PrematureEndOfDocumentError)
{
    xml.device()->waitForReadyRead(XML_READNEXT_TIMEOUT);
    tokenType = xml.readNext();
}

if (xml.hasError())
{
    ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20331668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档