Qt 5.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 がmoreの出力を開始するまで続行しません。基礎となる QProcess が空になるまで可能な限り速く読み取られ、QProcess が出力されなくなるため、初期段階でパーサーが不必要にハングするためと思われます。
私が必要とするのはxml.hasMoreElements()
、私が作ることができるようにすることです:
if (xml.device()->atEnd() && !xml.hasMoreElements())
{
xml.device()->waitForReadyRead(XML_READNEXT_TIMEOUT);
}
しかし、これを行う API 呼び出しが見つからないようです。
では、必要のないデータを待たないようにするにはどうすればよいでしょうか。