QScopedPointer m_Process;
m_process.reset(newqprocess ) this );
连接(m _ process.data (,signal ) readyreadstandardoutput )、this、slot )、onreadyread );
连接(m _ process.data (,signal ) finished )、this、slot (on finished ) ) )
m _ process-setreadchannel (qprocess 33603360标准输出;
m _ process-setworkingdirectory (qcoreapplication 33603360应用程序地址);
m_process-start(XXX.exe );
m_process-waitforfinished(-1;
qtringoutput=m _ process-readallstandardoutput (;
void my thread :3360 onreadyread (
{
char buffer[1024];
while(1)。
{
intret=m _ process-readline (buffer,1024 );
if(ret==0||ret==-1 ) () ) ) ) ) ) )
布雷克;
}
}
void my thread :3360 on finished (
{
m_Process.disConnectAll (;
}
QScopedPointer m_Process;
m_process.reset(newqprocess ) this );
连接(m _ process.data (,signal ) readyreadstandardoutput )、this,slot ) onreadyread ) );
连接(m _ process.data (,signal ) finished )、this、slot (on finished ) ) )
m _ process-setreadchannel (qprocess 33603360标准输出;
m _ process-setworkingdirectory (qcoreapplication 33603360应用程序地址);
m_process-start(XXX.exe );
m_process-waitforfinished(-1;
void my thread :3360 onreadyread (
{
qtringoutput=m _ process-readallstandardoutput (;
}
void my thread :3360 on finished (
{
m_Process.disConnectAll (;
}
第一种方法是在onReadyRead消息中逐行读取输出信息,并在过程结束后在readAllStandardOutput中读取其馀的数据。
但是,反复执行程序时崩溃并结束,错误信息如下
assert : ' bytes=buffer size ' infile toolsqringbuffer.CPP,line 74
测试结果显示,如果先接收到finish消息,然后运行readAllStandardOutput,则会报告错误。 如果不添加readAllStandardOutput,则无法完全读取进程输出。 我试着用了变量。 互斥锁定,信号量无法解决。 因为finish消息的到来是随机的。
将readAllStandardOutput放入finish消息中时,也可能会崩溃。 然后看不到崩溃信息。
最后,我们发现在finished等待之后加上100毫秒的延迟就可以了。 q thread :3360毫秒(100 )。
第二种方法是在onReadyRead消息中直接读取所有输出数据,经过测试,完全读取数据,避免崩溃。