来自QProcess的stdout远不是实时的

时间:2012-04-19 07:51:03

标签: qt stdout

我想将stdout从QProcess转换为QTextEdit。 如果我这样做就行了:

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

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

当子程序连续打印到stdout(在终端中测试) QTextEdit只用输出块每几秒更新一次。

2 个答案:

答案 0 :(得分:2)

来自QIODevice手册:

  

QIODevice的某些子类,例如QTcpSocket和QProcess,是异步的。这意味着诸如write()或read()之类的I / O函数总是立即返回,而当控制返回到事件循环时,可能会发生与设备本身的通信。 QIODevice提供的功能允许您立即执行这些操作,同时阻止调用线程而不进入事件循环。

要尝试的另一件事是禁用任何缓冲区,手册没有提及QProcess,但你可以试试:

  

一些子类,如QFile和QTcpSocket,是使用内存缓冲区实现的,用于中间存储数据。这减少了所需的设备访问呼叫的数量,这通常非常慢。

     

...

     

QIODevice允许您通过将Unbuffered标志传递给open()来绕过任何缓冲。

答案 1 :(得分:0)

调用waitForReadyRead()似乎会触发更新。

所以,要更新,例如

之后每秒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();
}