QScopedPointer<QProcess> m_Process;
m_Process.reset(new QProcess(this));
connect(m_Process.data(), SIGNAL(readyReadStandardOutput()), this, SLOT(onReadyRead()));
connect(m_Process.data(), SIGNAL(finished()), this, SLOT(onFinished()));
m_Process->setReadChannel(QProcess::StandardOutput);
m_Process->setWorkingDirectory(QCoreApplication::applicationDirPath());
m_Process->start("XXX.exe");
m_Process->waitForFinished(-1);
QString output = m_Process->readAllStandardOutput();
void MyThread::onReadyRead()
{
char buffer[1024];
while(1)
{
int ret = m_Process->readLine(buffer,1024);
if(ret == 0 || ret == -1)
break;
}
}
void MyThread::onFinished()
{
m_Process.disConnectAll();
}
QScopedPointer<QProcess> m_Process;
m_Process.reset(new QProcess(this));
connect(m_Process.data(), SIGNAL(readyReadStandardOutput()), this, SLOT(onReadyRead()));
connect(m_Process.data(), SIGNAL(finished()), this, SLOT(onFinished()));
m_Process->setReadChannel(QProcess::StandardOutput);
m_Process->setWorkingDirectory(QCoreApplication::applicationDirPath());
m_Process->start("XXX.exe");
m_Process->waitForFinished(-1);
void MyThread::onReadyRead()
{
QString output = m_Process->readAllStandardOutput();
}
void MyThread::onFinished()
{
m_Process.disConnectAll();
}
第一种方式的思路是在onReadyRead消息中一行一行读取输出信息,然后在进程结束后用readAllStandardOutput把剩余的数据读取出来。
但是反复执行程序会崩溃退出,报错信息如下
ASSERT: "bytes <= bufferSize" in file tools\qringbuffer.cpp, line 74
经测试发现如果finish消息先收到,后执行readAllStandardOutput会报错。如果不加readAllStandardOutput,进程输出不会完整读取。尝试用了变量,互斥锁,信号量都没法解决,因为finish消息的到来是随机的。
如果把readAllStandardOutput放在finish消息里面有时也会崩溃。并且看不到崩溃信息。
最后发现在waitForFinished后面加一个100毫秒延迟就好了,QThread::msleep(100)。
第二种方法的思路是在onReadyRead消息中直接读取所有输出数据,经测试,可以完整读出数据并且不会崩溃。