0

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 呼び出しが見つからないようです。

では、必要のないデータを待たないようにするにはどうすればよいでしょうか。

4

1 に答える 1

2

私はそれを解決したと思います。他に 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())
{
    ...
}
于 2013-12-02T19:45:25.233 に答える