2

QProcess から QTextEdit に stdout を取得したいと考えています。次のようにするとうまくいきます:

QObject::connect(process, SIGNAL(readyReadStandardOutput()),
                 this, SLOT(readStdOutput()));

void myClass::readStdOutput()
{
  teOutput->insertPlainText(process->readAllStandardOutput());
}

サブプログラムが継続的に stdout に出力している間 (端末でテスト)、QTextEdit は出力のチャンクで数秒ごとに更新されるだけです。

4

2 に答える 2

2

QIODeviceマニュアルから:

QTcpSocket や QProcess など、QIODevice の特定のサブクラスは非同期です。つまり、write() や read() などの I/O 関数は常にすぐに戻りますが、デバイス自体との通信は、制御がイベント ループに戻ったときに発生する可能性があります。QIODevice は、呼び出し元のスレッドをブロックし、イベント ループに入ることなく、これらの操作を強制的にすぐに実行できるようにする関数を提供します。

試してみるべきもう1つのことは、バッファを無効にすることです。マニュアルではQProcessについては言及されていませんが、試すことができます:

QFile や QTcpSocket などの一部のサブクラスは、データの中間格納にメモリ バッファを使用して実装されます。これにより、多くの場合非常に遅いデバイス アクセス コールの数が減ります。

...

Unbuffered フラグを open() に渡すことにより、QIODevice はバッファリングをバイパスすることができます。

于 2012-04-19T08:00:23.443 に答える
0

waitForReadyRead() を呼び出すと、更新がトリガーされるようです。

したがって、たとえば 1 秒あたり 10 回更新するには、

QObject::connect(process, SIGNAL(readyReadStandardOutput()),
             this, SLOT(readStdOutput()));

を追加

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(executeWaitForReadyRead()));
timer->start(100);

void YourClass::executeWaitForReadyRead()
{
    process->waitForReadyRead();
}
于 2013-12-08T15:51:25.723 に答える