在QT5.1中,QXMLStreamReader在等待QProcess生成更多数据时遇到了问题。
如果我从未缓冲的QProcess中读取行,它可以正常工作:
while(!vupProcess.state() == QProcess::NotRunning)
{
if (vupProcess.atEnd())
{
vupProcess.waitForReadyRead();
}
qDebug() << vupProcess.readLine();
}很明显:当缓冲区没有数据时,它会等待更多的数据。当有更多,它将打印线,而不等待。
现在,如果我想对QXMLStreamReader进行同样的处理,它可以工作,但是处理XML元素的时机是错误的(太晚了)。
考虑到这一点:
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(),这样我就可以:
if (xml.device()->atEnd() && !xml.hasMoreElements())
{
xml.device()->waitForReadyRead(XML_READNEXT_TIMEOUT);
}但我似乎找不到一个API调用来为我做到这一点。
那么,当数据不是必需的时候,我怎么不等待更多的数据呢?
发布于 2013-12-02 19:45:25
我想我解决了。没有方法来询问是否有更多的XML元素,但是readNext()调用将使QXMLStreamReader对象处于您可以检测到的状态,并用于让后端设备等待:
QXmlStreamReader::TokenType tokenType = xml.readNext();
while (xml.error() == QXmlStreamReader::PrematureEndOfDocumentError)
{
xml.device()->waitForReadyRead(XML_READNEXT_TIMEOUT);
tokenType = xml.readNext();
}
if (xml.hasError())
{
...
}https://stackoverflow.com/questions/20331668
复制相似问题