Qt 来自QProcess的标准输出远不是实时的

Qt 来自QProcess的标准输出远不是实时的,qt,stdout,Qt,Stdout,我想将标准输出从QProcess获取到QTextEdit。 如果我这样做,它会起作用: QObject::connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(readStdOutput())); 及 子程序连续打印到标准输出(在终端中测试) QTextEdit仅每隔几秒钟更新一次,其中包含大量输出。手册: QIODevice的某些子类,如QTcpSocket和QProcess,是异步的。

我想将标准输出从QProcess获取到QTextEdit。 如果我这样做,它会起作用:

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

子程序连续打印到标准输出(在终端中测试) QTextEdit仅每隔几秒钟更新一次,其中包含大量输出。

手册:

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

另一种尝试是禁用任何缓冲区,手册中没有提到QProcess,但您可以尝试:

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

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

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

因此,要更新,例如每秒更新10次

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


我尝试将
QIODevice::Unbuffered
传递到
QProcess::start()
,但没有成功(您可以传递它,但输出仍然是成批的)。无论如何,谢谢你的提示。看看这个可能相关的问题:我使用的是Win7 64位机器,编译的程序是32位的。我在XP上使用这个程序时也遇到了同样的问题。
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();
}